Тема 9. Защита от системных сбоев.
Принципы работы транзакций:
-
Принцип корректности – транзакция при отсутствии других транзакций переводит базу данных из одного согласованного состояния в другое.
-
Принцип атомарности – транзакция либо выполняется целиком, либо не выполняется вообще.
Операции транзакций по перемещению данных.
-
INPUT(X) – копирование блока диска, содержащего элемент X в оперативную память;
-
READ(X,t) – копирование элемента X в локальную переменную t;
-
WRITE(X,t) – копирование значения переменной t в элемент X в оперативной памяти;
-
OUTPUT(X) – копирование блока, содержащего элемент X из буфера оперативной памяти на диск.
Пример. Воздействие транзакции на оперативную память и диск.
Пусть согласованное состояние базы данных предполагает, что A=B.
Действия
|
T
|
A в памяти
|
В в памяти
|
А на диске
|
В на диске
|
READ(A,t)
|
8
|
8
|
|
8
|
8
|
t=t*2
|
16
|
8
|
|
8
|
8
|
WRITE(A,t)
|
16
|
16
|
|
8
|
8
|
READ(B,t)
|
8
|
16
|
8
|
8
|
8
|
t=t*2
|
16
|
16
|
8
|
8
|
8
|
WRITE(B,t)
|
16
|
16
|
16
|
8
|
8
|
OUTPUT(A)
|
16
|
16
|
16
|
16
|
8
|
OUTPUT(B)
|
16
|
16
|
16
|
16
|
16
|
Записи в протокол.
-
- транзакция Т стартовала;
-
- транзакция Т была завершена успешно;
-
- транзакция Т отменена.
Протокол возврата.
При выполнении команды WRITE осуществляется запись в протокол следующего типа:
<T,X,v> - транзакция Т изменяет элемент базы данных X, прежнее значение которого v.
Правила протокола-возврата.
-
Если транзакция T изменяет элемент базы данных X, тогда запись в протокол <T,X,v> должна быть записана до момента, когда новое значение элемента X будет записано на диске.
-
Если транзакция завершена успешно, тогда ее запись COMMIT в протокол должна быть записана только после того, как все элементы базы данных, измененные транзакцией, будут записаны на диск.
Для записи протокола на диск добавим команду: FLUSH LOG.
Пример.
№
|
Действие
|
t
|
A в памяти
|
В в памяти
|
А на диске
|
В на диске
|
Протокол
|
1
|
|
|
|
|
|
|
|
2
|
READ(A,t)
|
8
|
8
|
|
8
|
8
|
|
3
|
t=t*2
|
16
|
8
|
|
8
|
8
|
|
4
|
WRITE(A,t)
|
16
|
16
|
|
8
|
8
|
|
5
|
READ(B,t)
|
8
|
16
|
8
|
8
|
8
|
|
6
|
t=t*2
|
16
|
16
|
8
|
8
|
8
|
|
7
|
WRITE(B,t)
|
16
|
16
|
16
|
8
|
8
|
|
8
|
FLUSH LOG
|
|
|
|
|
|
|
9
|
OUTPUT(A)
|
16
|
16
|
16
|
16
|
8
|
|
10
|
OUTPUT(B)
|
16
|
16
|
16
|
16
|
16
|
|
11
|
|
|
|
|
|
|
|
12
|
FLUSH LOG
|
|
|
|
|
|
|
Правила восстановления с использование протокола-возврата.
Сканируем протокол с конца, фиксируя записи
и . При нахождении записи :
-
Если T – транзакция, для которой есть запись или , ничего не делаем.
-
В противном случае, требуется изменить на значение v элемент X на диске.
После проведения всех изменений для всех незавершенных транзакций записывается в протокол .
Контрольные точки.
При установке контрольной точки:
-
Запрещается прием новых транзакций.
-
Ожидается, когда все активные транзакции будут завершены или отменены.
-
Протокол записывается на диск.
-
Делается запись в протокол .
-
Возобновляется прием транзакций.
Например,
Неподвижные контрольные точки.
-
Делается запись в протокол , где T1…TK – идентификаторы активных транзакций;
-
Ожидается, пока все транзакции T1…TK не будут завершены или отменены, но не запрещается стартовать другим транзакциям.
-
После завершения транзакций T1…TK делается запись в протокол и записывается протокол на диск.
Например,
Протокол повтора.
При выполнении команды WRITE осуществляется запись в протокол следующего типа:
<T,X,v> - транзакция Т изменяет элемент базы данных X, новое значение которого v.
Правило. Перед модификацией любого элемента базы данных X на диске необходимо, чтобы все записи протокола, соответствующие этой модификации, включая записи и , были записаны на диск.
Пример.
№
|
Действие
|
t
|
A в памяти
|
В в памяти
|
А на диске
|
В на диске
|
Протокол
|
1
|
|
|
|
|
|
|
|
2
|
READ(A,t)
|
8
|
8
|
|
8
|
8
|
|
3
|
t=t*2
|
16
|
8
|
|
8
|
8
|
|
4
|
WRITE(A,t)
|
16
|
16
|
|
8
|
8
|
|
5
|
READ(B,t)
|
8
|
16
|
8
|
8
|
8
|
|
6
|
t=t*2
|
16
|
16
|
8
|
8
|
8
|
|
7
|
WRITE(B,t)
|
16
|
16
|
16
|
8
|
8
|
|
8
|
|
|
|
|
|
|
|
9
|
FLUSH LOG
|
|
|
|
|
|
|
10
|
OUTPUT(A)
|
16
|
16
|
16
|
16
|
8
|
|
11
|
OUTPUT(B)
|
16
|
16
|
16
|
16
|
16
|
|
12
|
FLUSH LOG
|
|
|
|
|
|
|
Правила восстановления при использовании протокола-повтора.
-
Определяем множество завершенных транзакций.
-
Сканируем протокол с начала. При нахождении записи :
а) Если T - незавершенная транзакция, ничего не делать;
б) Если Т – завершенная транзакция, записать значение v в элемент базы данных X.
-
Для каждой незавершенной транзакции T записать в протокол и перенести протокол на диск.
Контрольные точки.
-
Делается запись в протокол , где T1…TK – активные транзакции, записать протокол на диск.
-
Записывается на диск все элементы базы данных, которые были изменены транзакциями, которые были завершены до записи START CKPT, но еще не отображены на диске.
-
Записывается в протокол и протокол переносится на диск.
Например,
Протокол возврата-повтора.
При выполнении команды WRITE осуществляется запись в протокол следующего типа:
<T,X,v,w> - транзакция Т изменяет элемент базы данных X, старое значение которого v, а новое значение - w.
Правило. Перед изменением любого элемента базы данных X на диске необходимо, чтобы запись <T,X,v,w> попала на диск. Запись может, как предшествовать, так и следовать за любыми изменениями элементов на диске.
Пример.
№
|
Действие
|
t
|
A в памяти
|
В в памяти
|
А на диске
|
В на диске
|
Протокол
|
1
|
|
|
|
|
|
|
|
2
|
READ(A,t)
|
8
|
8
|
|
8
|
8
|
|
3
|
t=t*2
|
16
|
8
|
|
8
|
8
|
|
4
|
WRITE(A,t)
|
16
|
16
|
|
8
|
8
|
|
5
|
READ(B,t)
|
8
|
16
|
8
|
8
|
8
|
|
6
|
t=t*2
|
16
|
16
|
8
|
8
|
8
|
|
7
|
WRITE(B,t)
|
16
|
16
|
16
|
8
|
8
|
|
8
|
FLUSH LOG
|
|
|
|
|
|
|
9
|
OUTPUT(A)
|
16
|
16
|
16
|
16
|
8
|
|
10
|
|
|
|
|
|
|
|
11
|
OUTPUT(B)
|
16
|
16
|
16
|
16
|
16
|
|
12
|
FLUSH LOG
|
|
|
|
|
|
|
Правила восстановления с помощью протокола возврата-повтора.
-
Отменить все незавершенные транзакции, начиная с более поздней.
-
Повторить все завершенные транзакции, начиная с более ранней.
Контрольные точки.
-
Записывается в протокол , где T1…TK – активные транзакции;
-
Записываются на диск все буферы, содержащие измененные данные.
-
Записывается в протокол, протокол записывается на диск.
Например,
Архивирование.
Используется протокол типа повтора или повтора-возврата.
-
Заносится в протокол запись .
-
Выполняется контрольная точка по правилам соответствующего протокола.
-
Выполняется полная или частичная выгрузка данных.
-
Сохраняется протокол.
-
Заносится в протокол .
Пример. Пусть элементами базы данных являются (A,B,C,D). Начальные значения (1,2,3,4).
Диск Архив
Копируется А
А=5
Копируется В
С=6
Копируется С
B=7
Копируется D
Конечное состояние элементов базы данных (5, 7, 6, 4).
Копия базы данных в архиве – (1, 2, 6, 4).
Протокол.
;
;
;
;
;
|
;
;
Завершено архивирование
.
|