Если приоритет второй транзакции мал, то она ждать будет долго.
Минусы блокировок.
Совместимость блокировок.
запись объекта | Чтение объекта | запись части объекта | чтение части объекта | чтение/запись части объекта | |
запись объекта | нет | Нет | нет | нет | Нет |
чтение объекта | нет | Да | нет | да | Нет |
запись части объекта | нет | Нет | да | да | Да |
чтение части объекта | нет | Да | нет | да | Да |
чтение/запись части объекта | нет | Нет | нет | да | Нет |
Транзакция1 | Транзакция2 | Транзакция3 |
LOCK A ... ... UNLOCK A ... LOCK A | ... ... ... LOCK A | ... ... ... LOCK A ... UNLOCK A |
Решения:
1. Динамические приоритеты (чем дольше ждет, тем выше приоритет)
2. Ранжирование очередей (несколько очередей, в каждой транзакции одного приоритета. очереди обходятся по-порядку, из них по очереди достаются транзакции.
Транзакция1 | Транзакция2 |
LOCK A ... LOCK B ... ... | LOCK B ... LOCK A ... ... |
Дойдя до этого места, транзакции войдут в тупик, ожидая друг друга.
Способы обнаружения тупиков:
1. Контроль времени ожидания
2. Построение графа ожиданий.
При обнаружении подобной структуры выбирается транзакция с наименьшим приоритетом и она снимается.
Способы предупреждения тупиков:
1. упорядочить ресурсы БД и захватывать их в заданном порядке.
2. захватывать в транзакции сразу все объекты.
Двухфазный протокол:
Все операции LOCK должны предшествовать операциям UNLOCK.
Транзакция1 | Транзакция2 |
LOCK A LOCK B ….. LOCK C ….. UNLOCK A ….. | LOCK C
…..
UNLOCK C
……
……
|