Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Введение в СУБД HyTech.doc
Скачиваний:
11
Добавлен:
01.03.2025
Размер:
2.67 Mб
Скачать

Примеры работы с операторами завершения транзакции

Приведем пример работы операторов commit work и rollback work.

Пример:

drop table TMP; create table TMP (   MSG char(50) ); declare variable @nCode; begin work my_wrk table BOOK; @nCode = lastsqlerr(); if (@nCode != 0) {   insert into TMP (MSG)   values ("Не удалось начать транзакцию " + @nCode);   quit; } delete from BOOK; @nCode = lastsqlerr(); if (@nCode != 0) {   insert into TMP (MSG)   values ("Удаление закончилось ошибкой № " + @nCode);   rollback work my_wrk;   quit; } commit work my_wrk; @nCode = lastsqlerr(); if (@nCode != 0) {   insert into TMP (MSG)   values ("Не удалось завершить транзакцию " + @nCode);   rollback work my_wrk;   quit; } insert into TMP (MSG) values ("Данные успешно удалены");

Существенно, что механизм транзакций использует переменную часть таблиц для своей работы. Поэтому операции, которые «портят» переменную часть таблицы, не допустимы во время работы транзакций. Это оператор drop diff, удаляющий переменную часть таблицы и оператор pack table, переносящий данные из переменной части таблицы в постоянную часть.

Работа с транзакциями в многопользовательском режиме

В многопользовательском режиме один из пользователей может заблокировать работу других пользователей, начав транзакцию и не закончив ее, например, не подтвердил изменения или не откатил начатую транзакцию. Чтобы предотвратить такой захват, на выполнение транзакции отводится некоторое время. Если какой-либо пользователь начал транзакцию и не уложился в указанное время, то его транзакция принудительно обрывается. Этот пользователь вынужден будет в таком случае откатить транзакцию. Пока он этого не сделает, никакие действия с данными (кроме освобождения ресурсов) не допускаются.

При помощи оператора set transtime можно установить максимальное время для выполнения транзакций в секундах. Это время устанавливается для текущего пользователя.

Формат:

set transtime Время;

Аргументы:

Аргумент

Значение

Время

Максимальное время выполнения транзакции в секундах.

3.3.3 Блокировки Оператор блокирования таблицы lock

Блокировки используются для реализации логики последовательного изменения данных, когда заблокировать таблицу целиком по каким-то причинам неоправданно (например, транзакция при модификации таблицы блокирует ее целиком).

Оператор lock блокирует на запись строки, удовлетворяющие заданному логическому условию в таблице. Если логическое условие не задано, то захватываются все строки. Заблокированные строки необходимо будет освободить оператором unlock или удалить оператором delete. Все пользователи могут читать заблокированные строки, однако не могут поменять их или удалить.

Оператор lock делает поиск записей (аналогично оператору select) и затем производит блокировку записей. Если поиск делается не под транзакцией, то при поиске будет сделан снимок таблицы, если снимка не было.

Формат:

lock Имя_Таблицы [ where Предикат ];

Аргументы:

Аргумент

Значение

Имя_таблицы

Имя таблицы, в которой блокируются записи.

Предикат

Условие, которое определяет, какие записи необходимо заблокировать. Если условие опущено, то блокируются все записи.