Оператор commit work используется для того, чтобы успешно завершить транзакцию с указанным именем. Все изменения, сделанные в завершаемой транзакции, становятся видны для всех пользователей. После завершения транзакции пользователю рекомендуется обновить снимки (оператор fix table).
Формат:
commit work Имя_транзакции;
Аргументы:
Аргумент
Значение
Имя_транзакции
Имя транзакции, результаты которой надо зафиксировать. Транзакция должна быть явно начата оператором begin work.
Другим оператором для завершения транзакции является оператор rollback work.
Если выполняется оператор rollback work, то все изменения в таблицах, включенных в транзакцию, потеряются (произойдет «откат»). При этом прерывается выполнение транзакции и аннулируются все изменения в данных, которые были произведены в этой транзакции. Все таблицы, которые были задействованы в транзакции (они были перечислены в операторе begin work), возвращаются к тому состоянию, в котором они были на момент начала транзакции.
Если транзакцию пользователя прервали по времени (слишком долгая транзакция или пользователь забыл завершить транзакцию), то перед продолжением работы необходимо выполнить оператор rollback work.
Формат:
rollback work Имя_транзакции;
Аргументы:
Аргумент
Значение
Имя_транзакции
Имя транзакции, результаты которой надо отменить. Транзакция должна быть явно начата оператором begin work.
В механизме транзакций поддерживается откат действий, произведенных операторами insert, delete, update, и не поддерживается откат действий, произведенных операторами create table, create index, drop index и т.д.
Примеры работы с операторами завершения транзакции
Приведем пример работы операторов 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, переносящий данные из переменной части таблицы в постоянную часть.