Управл_данными / 16-транзакции
.pdf
Управляемые транзакции
Чтобы сделать транзакцию управляемой, нужно разбить ее SQL-операторы на логические части и явно указать, когда может быть выполнена отмена, а когда нет.
В некоторых СУБД требуется, чтобы вы явно отметили начало и конец каждого блока операторов транзакции.
|
|
|
|
|
Пример для СУБД |
Ms SQL Server : |
|
BEGIN TRANSACTION |
|
|
|
|
… |
|
|
|
|
COMMIT TRANSACTION |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Пример для СУБД |
MySQL: |
|
START TRANSACTION |
|
|
|
|
… |
|
|
|
|
|
|
В других СУБД используются вариации на указанную тему.
11
Использование оператора ROLLBACK
DELETE FROM Orders;
ROLLBACK;
Оператор ROLLBACK используется для отмены (аннулирования) операторов SQL
В этом примере выполняется и сразу же, посредством оператора ROLLBACK, аннулируется операция DELETE.
Хотя это и не самый полезный пример, он все равно показывает, что, будучи включенными в блок транзакции, операции DELETE (а также INSERT и UPDATE) не являются окончательными.
12
Использование оператора COMMIT
Обычно после выполнения операторов SQL результаты записываются непосредственно к таблицы баз данных.
Это называется неявная фиксация — операция фиксации (сохранения или записи) выполняется автоматически.
Однако внутри блока транзакции фиксация неявно может и не проводиться. Это зависит от того, с какой СУБД вы работаете. Некоторые СУБД трактуют завершение транзакции как неявную фиксацию.
Для безусловного выполнения неявной фиксации используется оператор COMMIT :
BEGIN TRANSACTION
DELETE Orderltems WHERE order_num = 12345
DELETE Orders WHERE order_num = 12345
COMMIT TRANSACTION
Блок транзакции применяется для того, чтобы заказ не мог быть удален частично. Конечный оператор COMMIT записывает изменения только в случае, если не произошло ошибки. Если первый оператор будет выполнен, а второй, из-за ошибки, не выполнен, удаление не будет зафиксировано.
13
Использование точек сохранения
Простые операторы ROLLBACK и COMMIT позволяют записывать или отменять транзакции в целом.
В некоторых случаях могут понадобиться фиксации или отмены части транзакции.
Для отмены части транзакции вы должны иметь возможность размещения меток в стратегически важных точках блока транзакции.
Потом, если понадобится отмена, вы сможете вернуть базу данных в состояние, соответствующее одной из меток.
В языке SQL эти метки называются точками сохранения (savepoints).
14
Создание точек сохранения
Для создания такой точки в СУБД MySQL и Oracle применяется оператор SAVEPOINT:
SAVEPOINT label_01
ВSQL Server и Sybase нужно сделать следующее:
SAVE TRANSACTION label_01
Здесь Label_01 - имя точки сохранения
Каждая точка сохранения должна иметь уникальное имя, идентифицирующее ее таким образом, чтобы, когда вы выполняете отмену, СУБД "знала", в какую точку она должна вернуться
15
Откат транзакции до точки сохранения
Для того, чтобы выполнить отмену действия всех операторов, Стоящих после точки сохранения,
в СУБД SQL Server нужно выполнить следующее:
ROLLBACK TRANSACTION label_01
В MySQL и Oracle :
ROLLBACK TO label_01
16
Полный пример
для Microsoft SQL Server
BEGIN TRANSACTION
INSERT INTO Client(cli_id, cli_name)
VALUES(4000000010', 'Toys Emporium');
SAVE TRANSACTION StartOrder;
INSERT INTO Orders(order_num, order_date, cli_id) VALUES(20100,'2001/12/1','1000000010');
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; INSERT INTO Orderltems(order_num, order_item, (i>prod_id, quantity, item_price)
VALUES(20010, 1, 'BR011, 100, 5.49);
IF @@ERROR <> 0 ROLLBACK TRANSACTION StartOrder; INSERT INTO Orderltems(order_num, order_item, 4>prod_id, quantity, item_price)
VALUES(20010, 2, 'BR031, 100, 10.99);
IF @@ERR0R <> 0 ROLLBACK TRANSACTION StartOrderj COMMIT TRANSACTION
17
Пояснения к приведенному выше примеру:
Имеется набор, состоящий из четырех операторов INSERT, включенных в блок транзакции.
Точка сохранения определена после первого оператора INSERT, так что если какая-то из последующих операций INSERT закончится неудачей, отмена транзакции произойдет лишь до этой точки.
В SQL Server для контроля успешности завершения какой либо операции может быть использована переменная с именем @@ERROR.
(В других СУБД используются иные функция или переменные для возвращения такой информации.)
Если переменная @@ERROR возвращает значение, отличное oт 0, значит, произошла ошибка и транзакция отменяется до точки сохранения.
Если обработка транзакции в целом завершается успешно, выполняется операция COMMIT для сохранения данных.
18
Журнал транзакций
вСУБД SQL Server
Каждая БД SQL Server включает в себя по крайней мере один файл журнала транзакций или несколько файлов, расположенных на разных дисках.
Каждый файл журнала транзакций — это отдельный файл операционной системы, который используется только одной БД и имеет расширение .ldf .
Запись журнала транзакций содержит всю информацию, необходимую для отмены или повторения любого изменения БД, включая выделение экстентов и изменение индексов.
Благодаря этому любое изменение, записанное на диск, например изменение страницы данных или создание нового объекта БД, может быть отменено, если транзакция, вызвавшая изменение, была прервана (допустим, из-за сбоя в работе сервера или в результате команды отмены транзакции) и ее невозможно завершить, либо может быть подтверждено, если транзакция была завершена, но результат, ее выполнения не был записан на диск, например, из-за неисправности сервера.
19
Курсоры
20
