Рассмотрим сценарий совместного выполнения двух транзакций, показанный на рис. 13.1. В момент времени t1
транзакция T1
изменяет объект базы данных o
(выполняет операцию W(o)). До завершения транзакции T1
в момент времени t2
> t1
транзакция T2
также изменяет объект o. В момент времени t3
> t2
транзакция T2
завершается оператором ROLLBACK
(например, по причине нарушения ограничений целостности).
Рис. 13.1. Потерянные изменения
Тогда при повторном чтении объекта o
(выполнении операции R(o)) в момент времени t4
> t3
транзакция T1
не видит своих изменений этого объекта, произведенных ранее (в частности, из-за этого может не удастся фиксация этой транзакции, что, возможно, повлечет потерю изменений у еще одной транзакции и т.д.).
Такая ситуация называется ситуацией потерянных изменений. Естественно, она противоречит требованию изолированности пользователей. Чтобы избежать такой ситуации в транзакции T1
требуется, чтобы до завершения транзакции T1
никакая другая транзакция не могла изменять никакой измененный транзакцией T1
объект o
(в частности, достаточно заблокировать доступ по изменению к объекту o
до завершения транзакции T1). Отсутствие потерянных изменений является минимальным требованием к СУБД при обеспечении изолированности одновременно выполняемых транзакций.