Сообщить об ошибке.

Управление транзакциями в модуле sqlite3 Python

Включить режим autocommit в модуле sqlite3

Базовая библиотека sqlite3 по умолчанию работает в режиме автоматической фиксации, а модуль sqlite3 в Python по умолчанию - нет.

Режим autocommit означает, что операторы, которые изменяют базу данных, вступают в силу немедленно. Оператор BEGIN или SAVEPOINT отключает режим автоматической фиксации autocommit, а команда COMMIT, ROLLBACK или RELEASE, которая завершает внешнюю транзакцию, снова включает режим автоматической фиксации.

Контроль транзакций через атрибут autocommit.

Новое в Python 3.12.

C версии Python 3.12. рекомендуемый способ управления поведением транзакции - через атрибут Connection.autocommit, который предпочтительно следует устанавливать с помощью параметра .autocommit функции sqlite3.connect().

Предлагается установить значение Connection.autocommit равным False, что подразумевает управление транзакциями, совместимое с PEP 249. Это означает:

  • Модуль sqlite3 гарантирует, что транзакция всегда открыта, поэтому sqlite3.connect(), Connection.commit() и Connection.rollback() неявно откроют новую транзакцию (сразу после закрытия ожидающей, для последних двух). Модуль sqlite3 использует отложенные инструкции BEGIN при открытии транзакций.
  • Транзакции должны быть зафиксированы явно с помощью функции Connection.commit().
  • Транзакции должны быть откатаны явно с помощью функции Connection.rollback().
  • Выполняется неявный откат, если база данных Connection.close() с ожидающими изменениями.

При установке для Connection.autocommit значение True, включается режим автоматической фиксации БД SQLite. В этом режиме Connection.commit() и Connection.rollback() не имеют никакого эффекта. Обратите внимание, что режим автоматической фиксации SQLite отличается от атрибута Connection.autocommit, совместимого с PEP 249. Для запроса низкоуровневого режима автоматической фиксации SQLite необходимо использовать Connection.in_transaction.

При установке для Connection.autocommit значение sqlite3.LEGACY_TRANSACTION_CONTROL, останавливает поведение управления транзакцией атрибуту Connection.isolation_level. Дополнительные сведения смотрите в следующем разделе.

Контроль транзакций с помощью атрибута isolation_level

Если для Connection.autocommit установлено значение sqlite3.LEGACY_TRANSACTION_CONTROL (по умолчанию), то поведение транзакции контролируется с помощью атрибута Connection.isolation_level. В противном случае уровень изоляции не имеет никакого эффекта.

Контроль транзакций до версии Python 3.12.

Модуль sqlite3 в Python по умолчанию выдает оператор BEGIN неявно перед оператором языка DML - модификации данных, т. е. INSERT/UPDATE/DELETE/REPLACE.

Описанное поведение можно контролировать, какой тип операторов BEGIN sqlite3 выполняется неявно, с помощью параметра isolation_level в вызове функции sqlite3.connect() или с помощью свойства соединений connection.isolation_level. Если не указать isolation_level, то будет используется простой BEGIN, что эквивалентно указанию isolation_level=DEFERRED. Другие возможные значения являются IMMEDIATE и EXCLUSIVE.

Можно отключить неявное управление транзакциями в модуле sqlite3, установив значение уровня изоляции на None. Это заставит базовую библиотеку sqlite3 работать в режиме автоматической фиксации. После этих действий можно полностью контролировать состояние транзакции, явно выполняя в своем SQL коде операторы BEGIN, ROLLBACK, SAVEPOINT и RELEASE.

Примеры использования:

Проще говоря, что бы включить autocommit необходимо соединяться с базой данных SQLite3 следующим образом.

import sqlite3

connect = sqlite3.connect(path_db)
# эта строка включает autocommit
connect.isolation_level = None

with connect:
    try:
        cur = connect.execute('INSERT/UPDATE ....')
    except sqlite3.Error as e:
        print(e)

    print(cur.lastrowid)