Проблема потери результатов обновления
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
Транзакция A
Время
Транзакция B
| Чтение |
|
--- |
| --- |
|
Чтение |
| Запись |
|
--- |
| --- |
|
Запись |
| Фиксация транзакции |
|
--- |
| --- |
|
Фиксация транзакции |
Потеря результата обновления
|
|
Результат. После окончания обеих транзакций, строка
содержит значение
, занесенное более поздней транзакцией B. Транзакция A ничего не знает о существовании транзакции B, и естественно ожидает, что в строке
содержится значение
. Таким образом, транзакция A потеряла результаты своей работы.
Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.
Транзакция A
Время
Транзакция B
| S-блокировка - успешна |
|
--- |
| Чтение |
|
--- |
| --- |
|
S-блокировка - успешна |
| --- |
|
Чтение |
| X-блокировка - отвергается |
|
--- |
| Ожидание… |
|
X-блокировка - отвергается |
| Ожидание… |
|
Ожидание… |
Ожидание…
|
Ожидание…
Обе транзакции успешно накладывают S-блокировки и читают объект
. Транзакция A пытается наложить X-блокирокировку для обновления объекта
. Блокировка отвергается, т.к. объект
уже S-заблокирован транзакцией B. Транзакция A переходит в состояние ожидания до тех пор, пока транзакция B не освободит объект. Транзакция B, в свою очередь, пытается наложить X-блокирокировку для обновления объекта
. Блокировка отвергается, т.к. объект
уже S-заблокирован транзакцией A. Транзакция B переходит в состояние ожидания до тех пор, пока транзакция A не освободит объект.
Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика.