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