Запускает, завершает, фиксирует или откатывает транзакцию вручную
BEGIN [DEFERRED | IMMEDIATE | EXCLUSIVE] [TRANSACTION [имя]]END [TRANSACTION [имя]]COMMIT [TRANSACTION [имя]]ROLLBACK [TRANSACTION [имя]]
QDB поддерживает транзакции с откатом и атомарной фиксацией. Необязательное имя транзакции игнорируется. На текущий момент QDB не поддерживает вложенные транзакции.
Все изменения вносятся в базы данных посредством транзакций. Любая команда, которая изменяет базу данных (т.е. любая команда SQL за исключением SELECT), автоматически запускает транзакцию, если в этот момент не выполняется другая транзакция. Транзакции, которые запускаются автоматически, фиксируются при завершении команды.
Можно запускать транзакции вручную с помощью команды BEGIN. Обычно эти транзакции завершаются следующей командой COMMIT или ROLLBACK. Тем не менее, транзакция выполняет команду ROLLBACK, если база данных закрывается либо возникает ошибка и указан алгоритм разрешения конфликтов ROLLBACK. Дополнительную информацию об алгоритме разрешения конфликтов ROLLBACK см. в описании условия SQL: ON CONFLICT.
В QDB существуют транзакции трех типов — отложенные, моментальные и эксклюзивные. Отложенные транзакции не блокируют базу данных до первого доступа к ней. Это означает, что база данных блокируется не оператором BEGIN, а первой операцией чтения или записи. Первая операция чтения создает блокировку SHARED, а первая операция записи — блокировку RESERVED. Поскольку блокировка осуществляется в отложенном режиме, другой поток или процесс может создать отдельную транзакцию и осуществить запись в базу данных после того, как текущий поток начинает выполнять команду BEGIN. При моментальной транзакции во время выполнения команды BEGIN для всех баз данных создается блокировка RESERVED; это происходит до первого обращения к базе данных.
Оператор BEGIN IMMEDIATE гарантирует, что другие потоки или процессы не могут вести запись в базу данных, а также выполнять операторы BEGIN IMMEDIATE и BEGIN EXCLUSIVE, при этом сохраняя возможность читать содержимое базы данных. Эксклюзивная транзакция создает блокировки EXCLUSIVE для всех баз данных. Оператор BEGIN EXCLUSIVE гарантирует, что другие потоки и процессы не могут выполнять чтение и запись в базу данных до завершения транзакции.
Блокировки
Ниже описаны блокировки SHARED, RESERVED и EXCLUSIVE:
По умолчанию в QDB используются отложенные транзакции.
Команда COMMIT фактически фиксирует транзакцию только по завершении всех текущих команд SQL. Например, если команда COMMIT запускается в момент, когда выполняется обработка двух или более операторов SELECT, транзакция фиксируется после вычисления их результатов.
Команда COMMIT может возвращать код SQLITE_BUSY
, если другой поток или процесс заблокировал базу данных, чтобы защитить ее от изменений во время чтения. При возникновении этой ошибки транзакция продолжает выполняться, и можно повторить операцию COMMIT, если есть основания полагать, что чтение базы данных завершено.
Выражения в SQL запросах, Ключевые слова, поддерживаемые QDB
Предыдущий раздел: перейти