Первый пример
Самый тривиальный случай, нарушение порядка доступа в
чистом виде, представляют собой две транзакции примерно следующего содержания:
Первая транзакция - T1.
BEGIN
TRAN
UPDATE Tbl SET X = 1 WHERE X = 1
UPDATE Tbl SET X = 3 WHERE X = 3
COMMIT TRAN
|
Вторая транзакция - T2.
BEGIN
TRAN
UPDATE Tbl SET X = 3 WHERE X = 3
UPDATE Tbl SET X = 1 WHERE X = 1
COMMIT TRAN
|
Если эти транзакции стартуют одновременно, то
произойдет взаимоблокировка по причине очевидного нарушения порядка доступа. T1
сначала обращается к записи X = 1, а затем к записи X = 3. Т2 же, наоборот, сначала обращается к записи X = 3, а затем к X = 1.
Рисунок 1. Порядок обращения к записям, приводящий к взаимоблокировке.
При одновременном старте Т1 захватывает запись X = 1, в это время Т2 успевает захватить запись X = 3. Затем T1 хочет захватить запись
X = 3, но она уже захвачена T2, поэтому T1 ожидает T2 на блокировке, и в граф
добавляется ребро T1->T2. Примерно в это же время T2 хочет захватить запись
X = 1, которая также уже захвачена T1. В графе ожидания появляется второе ребро
T2->T1 и он становится цикличным. Ну а поскольку подобная ситуация без
грубого вмешательства неразрешима, то одна из транзакций будет отменена, другая
же, пользуясь тем, что блокировка исчезла, спокойно завершит свою работу.
Способы лечения здесь также очевидны, достаточно
просто поменять порядок операторов в одной из транзакций. В общем случае
необходимо добиться того, чтобы все транзакции обращались к объектам в одном и
том же порядке.
Второй пример
Следующие примеры я постараюсь разобрать более
подробно, эмулируя поведение сервера в реальной ситуации.
Очень часто встречается примерно такая
последовательность операторов в одной транзакции:
Рекомендуем скачать другие рефераты по теме: урок изложение, диплом разработка.
Предыдущая страница реферата |
2
3
4
5
6
7
8
9
10
11
12 |
Следующая страница реферата