Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Управл_данными / 16-транзакции

.pdf
Скачиваний:
21
Добавлен:
03.06.2015
Размер:
1 Мб
Скачать
☆

Управляемые транзакции

Чтобы сделать транзакцию управляемой, нужно разбить ее 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

Соседние файлы в папке Управл_данными