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