Рис. 11.6 представляет собой модифицированный вариант рис. 11.1, показывающий, что произошло бы при параллельном" исполнении приведенных на рисунке транзакций под управлением механизма блокирования, предусмотренного в системе DB2.
Транзакция А | Время | Транзакция В | ||
— | — | |||
— | — | |||
FETCH R | t1 | — | ||
(установить блокировку | — | |||
типа S для R) | — | |||
— | t2 | FETCH R | ||
— | (установить блокировку | |||
— | типа S для R) | |||
— | — | |||
UPDATE R | t3 | — | ||
(запрос блокировки | — | |||
типа Х для R) | — | |||
ждать | t4 | UPDATE R | ||
ждать | (запрос блокировки | |||
ждать | типа Х для R) | |||
ждать | ждать | |||
ждать | ждать | |||
ждать | ждать | |||
Рис. 11.6. Не утрачиваются никакие обновления, но в момент t4 возникает тупиковая ситуация
Легко видеть, что запрос транзакции А в момент t3 на операцию UPDATЕ не принимается, поскольку это неявный запрос на блокировку типа Х для записи R, и такой запрос противоречит блокировке типа S, уже установленной транзакцией В. Поэтому А переходит в состояние ожидания. По аналогичным причинам транзакция В переходит в состояние ожидания в момент t4. Теперь обе транзакции не могут быть продолжены. Поэтому не возникает вопрос о том, что какое-либо обновление может быть утрачено. Таким образом, в системе DB2 проблема утраченного обновления решается путем сведения ее к другой проблеме, но это, по крайней мере, действительно решает первоначальную проблему! Эта новая проблема называется проблемой тупиковых ситуаций. Решение этой проблемы в системе DB2 обсуждается в разделе 11.7.
|
|