FirebirdSQL logo

Всё в Firebird выполняется в рамках транзакций.Транзакция — логическая единица изолированной работы группы последовательных операций над базой данных.Изменения над данными остаются обратимыми до тех пор, пока клиентское приложение не выдаст серверу инструкцию COMMIT.

Firebird имеет небольшое количество SQL операторов, которые могут использоваться клиентскими приложениями для старта, управления, подтверждения или отмены транзакций, но достаточное для всех задач над базой данных:

SET TRANSACTION

задание параметров транзакции и её старт;

COMMIT

завершение транзакции и сохранение изменений;

ROLLBACK

отмена изменений произошедший в рамках транзакции;

SAVEPOINT

установка точки сохранения для частичного отката изменений, если это необходимо;

RELEASE SAVEPOINT

удаление точки сохранения.

SET TRANSACTION

Назначение

Задаёт параметры транзакции и стартует её.

Доступно в

DSQL, ESQL

Синтаксис
SET TRANSACTION
   [NAME tr_name]
   [<tr_option> ...]

<tr_option> ::=
     READ {ONLY | WRITE}
   | [NO] WAIT
   | [ISOLATION LEVEL] <isolation level>
   | NO AUTO UNDO
   | RESTART REQUESTS
   | IGNORE LIMBO
   | LOCK TIMEOUT seconds
   | AUTO COMMIT
   | RESERVING <tables>
   | USING <dbhandles>


<isolation level> ::=
    SNAPSHOT [TABLE [STABILITY]]
  | SNAPSHOT AT NUMBER snapshot_number
  | READ COMMITTED [{[NO] RECORD_VERSION | READ CONSISTENCY}]

<tables> ::= <table_spec> [, <table_spec> ...]

<table_spec> ::= tablename [, tablename ...]
  [FOR [SHARED | PROTECTED] {READ | WRITE}]

<dbhandles> ::= dbhandle [, dbhandle ...]
Table 1. Параметры оператора SET TRANSACTION
Параметр Описание

tr_name

Имя транзакции.Доступно только в ESQL.

seconds

Время ожидания оператора (statement) в секундах при возникновении конфликта.

tables

Список таблиц для резервирования.

dbhandles

Список баз данных, к которым база данных может получить доступ.Доступно только в ESQL.

table_spec

Спецификация резервирования таблицы.

tablename

Имя таблицы для резервирования.

dbhandle

Хендл базы данных, к которой транзакция может получить доступ.Доступно только в ESQL.

snapshot number

Номер снимка другой транзакци, данные снимка базы данных которой должны быть общими с новой транзакцией.

Оператор SET TRANSACTION задаёт параметры транзакции и стартует её.Старт транзакции осуществляется только клиентскими приложениями, но не сервером (за исключением автономных транзакций и некоторых фоновых системных потоков/процессов, например, таких как sweep).

Каждое клиентское приложение может запускать произвольное количество одновременно выполняющихся транзакций.Фактически есть ограничение на общее количество выполняемых транзакций во всех клиентских приложениях, работающих с одной конкретной базой данных с момента последнего восстановления базы данных с резервной копии или с момента первоначального создания базы данных.Это количество равняется числу 248 -1 то есть ~ 2,8 x 1014 транзакций.В API и MON$ таблицах номер транзакции представляет собой 64 битное число.

Все предложения в операторе SET TRANSACTION являются необязательными.Если в операторе запуска транзакции на выполнение не задано никакого предложения, то предполагается старт транзакции со значениями всех характеристик по умолчанию (режим доступа, режим разрешения блокировок и уровень изолированности).

По умолчанию транзакция стартует со следующими характеристиками.

SET TRANSACTION
READ WRITE
WAIT ISOLATION LEVEL SNAPSHOT;

При старте со стороны клиента любой транзакции (заданной явно или по умолчанию) сервер передаёт клиенту дескриптор транзакции (целое число). На стороне сервера транзакциям последовательно присваиваются номера.Этот номер средствами SQL можно получить, используя контекстную переменную CURRENT_TRANSACTION.

Параметры транзакции

Основными характеристиками транзакции являются:

  • режим доступа к данным (READ WRITE, READ ONLY);

  • режим разрешения блокировок (WAIT, NO WAIT) с возможным дополнительным уточнением LOCK TIMEOUT;

  • уровень изоляции (READ COMMITTED, SNAPSHOT, SNAPSHOT TABLE STABILITY);

  • средства резервирования или освобождения таблиц (предложение RESERVING).

Имя транзакции

Необязательное предложение NAME задаёт имя транзакции.Предложение NAME доступно только в Embedded SQL.Если предложение NAME не указано, то оператор SET TRANSACTION применяется к транзакции по умолчанию.За счёт именованных транзакций позволяется одновременный запуск нескольких активных транзакций в одном приложении.При этом должна быть объявлена и инициализирована одноименная переменная базового языка.В DSQL, это ограничение предотвращает динамическую спецификацию имён транзакций.