![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
Использование в транзакциях блокировок само по себе не гарантирует упорядоченного плана транзакций.
Например
T1 | T2 |
begin tran | begin tran |
writeLock X | |
read X | |
X=X+100 | |
write X | |
unlock X | |
writeLock X | |
read X | |
X=X=1.1 | |
write X | |
unlock X | |
writeLock Y | |
read Y | |
Y=Y*1.1 | |
write Y | |
unlock Y | |
commit | |
writeLock Y | |
read Y | |
Y=Y+100 | |
write Y | |
Commit |
То есть план остался таким же неупорядоченным, как и при отсутствии блокировки. /*При последовательном выполнении транзакций значения элементов были бы другими. */
Проблема неупорядоченности осталась, из-за того, что первая транзакция сняла блокировку с элемента, а затем установила блокировку на другой элемент. Это сделано вроде бы для повышения производительности, но результат – некорректная работа плана.
Для обеспечения упорядоченности планов используют протоколы, устанавливающие правила на установку и снятие блокировок. Самый известный из таких протоколов – протокол двухфазной блокировки.
Транзакция следует этому протоколу, если в ней все операции блокирования предшествуют первой операции разблокирования.
Таким образом, транзакция делится на две фазы. 1 Фаза нарастания, в которой выполняются все необходимые блокировки, не освобождая ни одного элемента. 2 Фаза сжатия, в которой освобождаются элементы и не устанавливается ни одна блокировка. Однако, нет никакой потребности в том, чтобы все требуемые блокировки устанавливались одновременно.
Если бы транзакции T1 и T2 в предыдущем примере следовали двухфазному протоколу, то Т1 не снимала бы блокировку с элемента X до тех пор, пока заблокировала элемент Y. А Т2 находилась бы в состоянии ожидания, пока T1 не разблокирует X. Таким образом, устраняется неупорядоченность.
Дата публикования: 2015-02-18; Прочитано: 490 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!