ВВЕДЕНИЕ В СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ

       

Проблема потери результатов обновления


Две транзакции по очереди записывают некоторые данные в одну и ту же строку и фиксируют изменения.

Транзакция 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 не освободит объект.

Результат. Обе транзакции ожидают друг друга и не могут продолжаться. Возникла ситуация тупика.



Содержание раздела