Рис. 11.7 и 11.8 являются модифицированными вариантами рис. 11.2 и 11.3 соответственно, показывающими, что произошло бы при параллельном исполнении представленных на этих рисунках транзакций под управлением механизма блокирования, используемого в системе DB2. Нетрудно видеть, что операция транзакции А, запрашиваемая в момент t2 (FETCH—на рис. 11.7 и UPDATE—на рис. 11.8), в обоих случаях не выполняется, поскольку это неявный запрос на блокировку R, а такой запрос вступает в конфликт с уже установленной транзакцией В блокировкой типа X. Поэтому А переходит в состояние ожидания. Она остается в этом состоянии до тех пор, пока В не достигнет точки синхронизации, выполняя операцию COMMIT или ROLLBACK. При этом установленная транзакцией В блокировка снимается, и А получает возможность продолжать исполнение. В этот момент А «видит» зафиксированное значение — либо значение, предшествующее исполнению В, если В завершается операцией ROLLBACK, либо значение, соответствующее успешному завершению В, в противном случае. В любом случае А больше не зависит от незафиксированных обновлений.
|
|
Транзакция А | Время | Транзакция В | ||
— | — | |||
— | — | |||
— | t1 | UPDATE R | ||
— | (запрос блокировки | |||
— | типа Х для R) | |||
FETCH R | t2 | — | ||
(запрос блокировки | — | |||
типа S для R) | — | |||
ждать | — | |||
t3 | точка синхронизации | |||
ждать | (снять блокировку типа | |||
Х для R) | ||||
ждать | — | |||
повторно: FETCH R | t4 | |||
(установить блокировку | ||||
типа S для R) | ||||
— | ||||
Рис. 11.7. Предотвращается ситуация, когда транзакция А «увидела» бы в момент t2 незафиксированное изменение
Транзакция А | Время | Транзакция В | ||
— | — | |||
— | — | |||
— | t1 | UPDATE R | ||
— | (установить блокировку | |||
— | типа Х для R) | |||
UPDATE R | t2 | — | ||
(запрос блокировки | — | |||
типа Х для R) | — | |||
ждать | — | |||
ждать | t3 | точка синхронизации | ||
ждать | (снять блокировку типа | |||
Х для R) | ||||
повторно: UPDATE R | t4 | |||
(установить блокировку | ||||
типа Х для R) | ||||
Рис. 11.8. Предотвращается ситуация, когда транзакция А обновила бы в момент t2 незафиксированное изменение