Операционная система ЗОСРВ «Нейтрино» > Руководство разработчика > Программные интерфейсы общего назначения > Прикладные библиотеки и технологии > Библиотека менеджера QDB > Справочник по командам SQL, поддерживаемым менеджером QDB > SQL: TRANSACTION



SQL: TRANSACTION

Запускает, завершает, фиксирует или откатывает транзакцию вручную

Прототип:

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:

SHARED
База данных доступна для чтения, но недоступна для записи. Блокировка SHARED может использоваться любым количеством процессов и потоков, что позволяет им одновременно читать базу данных. Если у файла базы данных имеется как минимум одна активная блокировка SHARED, все операции записи в него запрещены.
RESERVED
Процесс или поток планирует выполнять запись в файл базы данных в будущем, однако в текущий момент только читает его. В каждый момент времени может быть активной только одна блокировка RESERVED, при этом одновременно с ней могут использоваться несколько блокировок SHARED.
EXCLUSIVE
Блокировка EXCLUSIVE необходима для записи в файл базы данных. Файл может иметь единственную блокировку EXCLUSIVE, при этом никакие другие блокировки не могут использоваться одновременно с ней. Для достижения максимального уровня параллелизма при выполнении транзакций QDB минимизирует длительность блокировок EXCLUSIVE.

По умолчанию в QDB используются отложенные транзакции.

Команда COMMIT фактически фиксирует транзакцию только по завершении всех текущих команд SQL. Например, если команда COMMIT запускается в момент, когда выполняется обработка двух или более операторов SELECT, транзакция фиксируется после вычисления их результатов.

Возвращаемое значение:

Команда COMMIT может возвращать код SQLITE_BUSY, если другой поток или процесс заблокировал базу данных, чтобы защитить ее от изменений во время чтения. При возникновении этой ошибки транзакция продолжает выполняться, и можно повторить операцию COMMIT, если есть основания полагать, что чтение базы данных завершено.

Тематические ссылки:

Выражения в SQL запросах, Ключевые слова, поддерживаемые QDB




Предыдущий раздел: перейти