В некоторых системах нет разделения на типы блокировок, т.е. каждая блокировка является исключительной. Если транзакция должна вначале считать некоторый объект, а затем изменить его, то транзакция может запрашивать либо только исключительную группировку, либо может начиналь с разделяемой группировки, а затем переходить к исключительной группировке.В этом случае в механизме блокировки предполагается существование дополнительного примитива, который называется lock_escalation.
Менеджер блокировок получает запросы на блокировки от различных транзакций и может разрешить блокировку или не разрешить, это зависит от группировок, которые были наложены другими транзакциями. Если группировка не разрешена, то соответствующая транзакция переходит в состояние ожидания. Если блокировка выходит из состояния ожидания, в том случае если ресурс, который она запрашивает, освобожден. Все разрешенные блокирвки хранятся в таблице блокировок log table, которая обрабатывается менеджером группы.
Менеджер блокировок удовлетворяет запрос на блокировку или отклоняет его, на основании следующей таблицы, которая называется таблицей конфликтов блокировок.
Запрос |
Состояние ресурса |
||
free |
r_locked |
w_locked |
|
r_lock |
OK/r_locked |
OK/r_locked |
No/w_locked |
w_lock |
OK/w_locked |
No/r_locked |
No/w_locked |
unlock |
- |
OK/depends |
OK/free |
Для того, чтобы гарантировать, что транзакции (особенно параллельнае) приводят к такому же рузультату, что и при последовательном выполнении, должно выполняться следующее требование, налагаемое на порядок запросов на блокировку. Это требование или ограничение называется двухфазной блокировкой. Иребование формулируется слЕДУЮЩИМ ОБРАЗОМ: после снятия блокировки транзакция не может запрашивать блокировку.
В транзакции можно выделить две фазы:
1) во время первой фазы транзакция запрашивает ресурсы или налагает блокировку на ресурсы.
2) во время второй фазы ресурсы освобождаются.
Протокол двухфазной блокировки:
Пример решения проблемы фантомных изменений.
t1 |
t2 |
x |
y |
z |
bot |
free |
free |
free |
|
r_lock1(x) |
1: read |
|||
r1(x) |
||||
bot |
||||
w_lock2(y) |
2:write |
|||
r2(y) |
||||
r_lock1(y) |
1:wait |
|||
y = y-100 |
||||
w_lock2(z) |
2:write |
|||
r2(z) |
||||
z = z+100 |
||||
w2(y) |
||||
w2(z) |
||||
commit |
||||
unlock2(y) |
1:read |
|||
r1(y) |
||||
r_lock1(z) |
1:wait |
|||
unlock2(z) |
1:read |
|||
r1(z) |
||||
eot |
||||
commit |
||||
unlock1(x) |
free |
|||
unlock1(y) |
free |
|||
unlock1(z) |
free |
|||
eot |
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.