Проблема незафиксированной зависимости.
Проблема потери результатов обновления.
Решение проблем параллелизма
Рассмотрим решение проблем параллелизма с помощью механизма блокировок.
На
рис. 15.7 приведена измененная версия процесса, показанного на
рис. 15.2, с учетом применения протокола блокировки для чередующихся операций. Операция обновления для транзакции A в момент времени t3 не будет выполнена, поскольку она является неявным запросом с заданием Х-блокировки для кортежа р, а этот запрос вступает в конфликт с S-блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания. По аналогичным причинам транзакция B переходит в состояние ожидания в момент времени t4.Обновления теперь не утрачиваются, однако возникает новая проблема – бесконечное ожидание или тупиковая ситуация. Способы решения этой проблемы рассматриваются ниже.
Транзакция A | Время | Транзакция B |
Извлечение кортежа р (задание S-блокировки для p) | t1 | – |
– | t2 | Извлечение кортежа р (задание S-блокировки для p) |
Обновление кортежа р (задание X-блокировки для p) | t3 | – |
Ожидание | t4 | Обновление кортежа р (задание X-блокировки для p) |
Ожидание | Ожидание |
рис. 15.7. Хотя обновления не утрачиваются, но в момент времени t4 возникает тупиковая ситуация.
На
рис. 15.8,
рис. 15.9 приведены в измененном виде примеры, показанные ранее на
рис. 15.3 и
рис. 15.4 соответственно. Они демонстрируют чередующееся выполнение операций согласно описанному выше протоколу блокировки. Операция для транзакции A в момент времени t2 (извлечение на
рис. 15.8 и обновление на
рис. 15.9) не будет выполнена. Дело в том, что она является неявным запросом с заданием блокировки для кортежа р, а этот запрос вступает в конфликт с Х-блокировкой, уже заданной транзакцией B. Таким образом, транзакция A переходит в состояние ожидания до тех пор, пока не будет прекращено выполнение транзакции B (до операции окончания или отмены выполнения транзакции B). Тогда заданная транзакцией B блокировка будет снята и транзакция A может быть выполнена. Причем транзакция A будет иметь дело с некоторым фиксированным значением (либо существовавшим до выполнения транзакции B при отмене ее выполнения, либо полученным после выполнения транзакции B). В любом случае транзакция A больше не зависит от незафиксированного обновления.
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р (задание X-блокировки для p) |
Извлечение кортежа р (задание S-блокировки для p) | t2 | – |
Ожидание | t3 | Отмена выполнения транзакции (снятие X-блокировки для p) |
Итог: Извлечение кортежа р (задание S-блокировки для p) | t4 |
рис. 15.8. Транзакция A предохраняется от выполнения операций с незафиксированным изменением в момент времени t2.
Транзакция A | Время | Транзакция B |
– | t1 | Обновление кортежа р (задание X-блокировки для p) |
Обновление кортежа р (задание X-блокировки для p) | t2 | – |
Ожидание | t3 | Отмена выполнения транзакции (снятие X-блокировки для p) |
Итог: Обновление кортежа р (задание X-блокировки для p) | t4 |
рис. 15.9. Транзакция A предохраняется от выполнения операций с незафиксированным изменением в момент времени t2.