Sql Scholl
Распечатать страницу
Перейти на главную Карта сайта Отправить сообщение

Обработка транзакций

Использование точек сохранения

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

     Например, процесс добавления заказа, описанный выше, представляет собой одну транзакцию. Если произойдет ошибка, вы просто вернетесь в состояние, когда строка в таблицу Orders еще не была добавлена. Но вы вряд ли захотите отменить добавление данных в таблицу Customers (если оно было сделано).

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

     В языке SQL эти метки называются точками сохранения (savepoints). Для создания такой точки в СУБД MySQL и Oracle применяется оператор SAVEPOINT:

SAVEPOINT deletel;

      В SQL Server и Sybase нужно сделать следующее:

SAVE TRANSACTION deletel;

      Каждая точка сохранения должна иметь уникальное имя, идентифицирующее ее таким образом, чтобы, когда вы выполняете отмену, СУБД "знала", в какую точку она должна вернуться. Чтобы выполнить отмену действия всех операторов после этой точки, в СУБД SQL Server нужно выполнить следующее:

ROLLBACK TRANSACTION deletel;

     В MySQL и Oracle можно сделать так:

ROLLBACK TO deletel;

    А вот полный пример для SQL Server:

BEGIN TRANSACTION
INSERT INTO Customers(cust_id, cust_name)
VALUES('1000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cust_id)
VALUES(2 0100,'2001/12/1','1000000010');
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO Orderltems(order_num, order_item,
lbprod_id, quantity, item_price)
VALUES(20010, 1, 'BROl', 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder;
INSERT INTO Orderltems(order_num, order_item,
%prod_id, quantity, item_price)
VALUES(20010, 2, 'BR03', 100, 10.99);
IF @@ERR0R о 0 ROLLBACK TRANSACTION StartOrder; 
COMMIT TRANSACTION

     Здесь имеется набор, состоящий из четырех операторов INSERT, включенных в блок транзакции. Точка сохранения определена после первого оператора INSERT, так что если какая-то из последующих операций INSERT закончится неудачей, отмена транзакции произойдет лишь до этой точки. В SQL Server для контроля успешности завершения какой-либо операции может быть использована переменная с именем @@ERROR. (В других СУБД используются иные функции или переменные для возвращения такой информации.) Если переменная @@ERROR возвращает значение, отличное от О, значит, произошла ошибка и транзакция отменяется до точки сохранения. Если обработка транзакции в целом завершается успешно, выполняется операция COMMIT для сохранения данных.

Чем больше точек сохранения, тем лучше

Вы можете создать столько точек сохранения в вашем SQL-коде, сколько захотите, и чем больше, тем лучше. Почему? Потому что чем больше у вас точек сохранения, тем большая гибкость вам доступна в управлении отменами.