Работа с курсорами в 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? Оператор является так или иначе дополнительным, достаточно вызвать фиксацию () вместо этого?
Решил ответить себе:
ветка о транзакциях DB API 2.0 в python-list и следующий отрывок из заметного книга Полный справочник по SQL заставляет меня думать, что DB API реализует стандартное поведение SQL1:
Первая версия стандарта SQL (SQL1) определяла режим неявной транзакции на основе поддержки транзакций в ранних выпусках DB2. В неявном режиме поддерживаются только операторы COMMIT и ROLLBACK. Транзакция SQL автоматически начинается с первого оператора SQL, выполненного пользователем или программой, и заканчивается, когда выполняется COMMIT или ROLLBACK. Конец одной транзакции неявно запускает новую.
Явный режим транзакции (SQL2 и SQL: 1999) кажется удобным, когда RDBSM поддерживает режим автоматической фиксации и текущее соединение находится в этом режиме, но API БД просто не отражает этого.
посмотрите на этот ранее заданный вопрос . Обычно "протокол" для использования с транзакциями:
cursor = conn.cursor()
try:
cursor.execute(...)
except DatabaseError:
conn.rollback()
raise
else:
conn.commit()
finally:
cursor.close()
Начиная с python 2.6 sqlite Объекты соединения
могут использоваться в качестве диспетчеров контекста, которые автоматически фиксируют или откатывают транзакции .