
Субтранзакции
Версия SQL:1999 или SQL3 ввела многоуровневые транзакции, т.е. транзакции могут состоять из нескольких субтранзакций. Субтранзакции имеют промежуточные точки отката, которые устанавливаются с помощью оператора SAVEPOINT (точка отката или сохранения). Точка отката создается с помощью оператора вида
SAVEPOINT имя_точки_отката;
Этот оператор применяется вместе с оператором ROLLBACK:
ROLLBACK TO SAVEPOINT имя_точки_отката;
Благодаря этому можно отменять не всю транзакцию, а только ту её часть, которая расположена между ROLLBACK и точкой отката. В этом случае сознательно нарушается свойство атомарности всей транзакции.
Журнал транзакций
Для фиксации хода выполнения транзакций, т.е. изменений в БД, многие СУБД ведут во внешней (дисковой) памяти специальный журнал в базе данных, называемый журналом транзакций (log) или журналом изменений. Он содержит сведения обо всех изменениях, выполненных в БД в хронологическом порядке. Только после записи всех изменений в журнал транзакций, информация переносится из оперативной памяти во внешнюю и транзакция будет завершена. Поэтому журнал может использоваться для восстановления БД после сбоя.
Журнал должен содержать копию каждой записи или страницы БД перед её изменением. Такие сведения называют исходными образами (старые значения). Отмена транзакций производится записью в базу данных исходных образов всех произведенных изменений (новые значения).
Также журнал должен содержать копии всех записей после их изменения. Их называют конечными образами данных (новые значения).
Таким образом, в файл журнала может помещаться следующая информация:
Порядковый номер
Идентификатор транзакции Тип операции
Указатель назад Объект изменений
Указатель вперед Старое значение
(исходный образ)
Время начала и завершения Новое значение
(конечный образ)
Пример
Номер
|
Иденти- фикатор |
Указатель назад |
Указатель вперед |
Время |
Операция |
Объект изменений |
Старое значение |
Новое значение |
1 |
ОТ1 |
0 |
2 |
9:12 |
START |
|
|
|
2 |
ОТ1 |
1 |
4 |
9:13 |
UPDATE |
Заказчик А |
(ст. знач.) |
(нов. знач.) |
3 |
ОТ2 |
0 |
8 |
9:16 |
START |
|
|
|
4 |
ОТ1 |
2 |
5 |
9:17 |
UPDATE |
Товар 100 |
(ст. знач.) |
(нов. знач.) |
5 |
ОТ1 |
4 |
7 |
9:17 |
INSERT |
Заказ 12 |
|
значение |
6 |
КТ1 |
0 |
9 |
9:18 |
START |
|
|
|
7 |
ОТ1 |
5 |
0 |
9:19 |
COMMIT |
|
|
|
8 |
ОТ2 |
3 |
0 |
9:20 |
COMMIT |
|
|
|
9 |
КТ1 |
6 |
10 |
9:21 |
UPDATE |
Заказ 85 |
(ст. знач.) |
(нов. знач.) |
10 |
КТ2 |
9 |
0 |
9:21 |
COMMIT |
|
|
|
START означает начало транзакции, COMMIT - её окончание, INSERT ,UPDATE, DELETE - действия транзакции Все действия каждой транзакции связаны между собой указателями. Указатель назад указывает на предыдущее изменение, сделанное данной транзакцией. Например, в строке 7 транзакция ОТ1 ссылается на строку 5, которая является предыдущим действием этой транзакции. Указатель вперед ссылается на следующее изменение, выполненное данной транзакцией (прямой указатель). В строке 4 указатель вперед указывает на строку 5. Нуль в поле указателя означает конец списка. Транзакция будет завершена.
Подсистема восстановления использует эти указатели для отыскания всех записей, относящихся к данной транзакции. Программа восстановления БД заменяет каждую изменённую запись её исходным образом. Когда имеется копия ранней версии БД, то можно повторно выполнить транзакции записью из журнала транзакций конечных образов данных.