Книга: Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ

Запуск транзакции

SQL

Оператор SQL для запуска транзакции имеет следующий синтаксис:

SET TRANSACTION [NAME <имя-транзакции>]

[READ WRITE | READ ONLY] /* режим доступа */

[WAIT | NO WAIT] /* режим разрешения блокировок */

[ISOLATION LEVEL] /* уровень изоляции */

{SNAPSHOT [TABLE STABILITY] | READ COMMITTED [[NO] RECORD VERSION]}

[RESERVING <предложение-резервирования>

| USING <дескриптор-базы-данных> [,дескриптор-базы-данных...]];

Финальное предложение RESERVING задает необязательное резервирование таблиц, обсуждавшееся в предыдущей главе. Его синтаксис представляется в виде:

<предложение-резервирования> : := <таблица> [, <та&лица> ...] [FOR [SHARED | PROTECTED] {READ | WRITE}]

[, <предложение-резервирования> [, <предложение-резервирования> ...]]

! ! !

ПРИМЕЧАНИЕ. Необязательное имя транзакции - объявляемое в приложении и указываемое в предложении SET TRANSACTION - недоступно нигде, кроме ESQL.

. ! .

Вы можете проверить этот оператор в isql. Откройте базу данных employee.fdb и запустите новую транзакцию следующим образом:

SQL> COMMIT;

SQL> SET TRANSACTION READ WRITE ISOLATION LEVEL SNAPSHOT TABLE STABILITY;

SQL> SELECT EMP_NO, FIRST_NAME, LAST_NAME

CON> FROM EMPLOYEE WHERE FIRST_NAME = 'Robert';

EMP NO FIRST NAME LAST NAME

==========================

2 Robert Nelson

SQL>

! ! !

СОВЕТ. Ключевые слова ISOLATION LEVEL являются необязательными, READ WRITE и WAIT являются значениями по умолчанию и могут быть опущены, если не требуются другие значения.

. ! .

Затем откройте другое окно командной строки и запустите isql или другой инструмент, который позволит вам конфигурировать тарнзакции, и запустите другую транзакцию чтения/записи для той же базы данных:

SQL> COMMIT;

SQL> SET TRANSACTION READ WRITE NOWAIT SNAPSHOT;

Теперь через тот же интерфейс попытайтесь изменить любую строку в базе данных tmployee.fdb:

SQL> UPDATE EMPLOYEE SET FIRST_NAME = 'Dodger'

SQL> WHERE FIRST_NAME = 'Roger';

ISC ERROR CODE:335544345

lock coflict on no wait transaction (конфликт блокировки для транзакции, не являющейся ожидаемой)

Как и ожидалось, эта транзакция будет заблокирована для записи любой строки таблицы EMPLOYEE, потому что при выборе данных из той же таблицы первая транзакция запросила блокировку на уровень таблицы. Вторая тарнзакция имеет установку разрешения блокировки NOWAIT и немедленно выдает исключение, потому что не может выполнить изменение.

Транзакция по умолчанию

Следующий оператор также допустим:

SQL> COMMIT;

SQL> SET TRANSACTION;

Он запускает транзакцию, как и большинство операторов, с конфигурацией по умолчанию, что эквивалентно:

SQL> COMMIT;

SQL> SET TRANSACTION READ WRITE WAIT SNAPSHOT;

! ! !

ПРИМЕЧАНИЕ. Существует еще "транзакция по умолчанию", которая используется в клиентах ESQL для сконфигурированной единой транзакции, определенной на сервере и клиенте константой gds trans. Клиент ESQL стартует эту транзакцию автоматически, если он передает оператор запроса, а перед этим никакая транзакция явно не запускалась.

. ! .

Оглавление книги

Оглавление статьи/книги

Генерация: 0.807. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз