Почему соединение в DB-API Python не имеет, “начинают” операцию?

Работа с курсорами в mysql-python, который я раньше называл, "НАЧИНАЕТСЯ"; "ФИКСАЦИЯ"; и "ОТКАТ"; явно следующим образом:

try:
    cursor.execute("BEGIN;")
    # some statements
    cursor.execute("COMMIT;")
except:
    cursor.execute("ROLLBACK;")

затем, я узнал, что базовый объект соединения имеет соответствующие методы:

try:
    cursor.connection.begin()
    # some statements
    cursor.connection.commit()
except:
    cursor.connection.rollback()

Осмотр DB-API PEP, я узнал, что он не упоминает начинание () метод для объекта соединения, даже для расширений.

Mysql-python, между прочим, бросает DeprecationWarning при использовании метода. sqlite3.connection, например, не имеет метода вообще.

И вопрос состоит в том, почему нет такого метода в PEP? Оператор является так или иначе дополнительным, достаточно вызвать фиксацию () вместо этого?

8
задан newtover 7 May 2010 в 11:40
поделиться

2 ответа

Решил ответить себе:

ветка о транзакциях DB API 2.0 в python-list и следующий отрывок из заметного книга Полный справочник по SQL заставляет меня думать, что DB API реализует стандартное поведение SQL1:

Первая версия стандарта SQL (SQL1) определяла режим неявной транзакции на основе поддержки транзакций в ранних выпусках DB2. В неявном режиме поддерживаются только операторы COMMIT и ROLLBACK. Транзакция SQL автоматически начинается с первого оператора SQL, выполненного пользователем или программой, и заканчивается, когда выполняется COMMIT или ROLLBACK. Конец одной транзакции неявно запускает новую.

Явный режим транзакции (SQL2 и SQL: 1999) кажется удобным, когда RDBSM поддерживает режим автоматической фиксации и текущее соединение находится в этом режиме, но API БД просто не отражает этого.

4
ответ дан 5 December 2019 в 15:21
поделиться

посмотрите на этот ранее заданный вопрос . Обычно "протокол" для использования с транзакциями:

cursor = conn.cursor()
try:
    cursor.execute(...)
except DatabaseError:
    conn.rollback()
    raise
else:
    conn.commit()
finally:
    cursor.close()

Начиная с python 2.6 sqlite Объекты соединения могут использоваться в качестве диспетчеров контекста, которые автоматически фиксируют или откатывают транзакции .

7
ответ дан 5 December 2019 в 15:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: