![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
|
Использование в транзакциях блокировок само по себе не гарантирует упорядоченного плана транзакций.
Например
| 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; Прочитано: 528 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!
