Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Базы данных.doc
Скачиваний:
114
Добавлен:
16.03.2016
Размер:
5.67 Mб
Скачать

13.2.3. Изолированность транзакций

В многопользовательских системах с одной базой данных одновременно может работать несколько пользователей или прикладных программ. Предельной задачей системы является обеспечение изолированности пользователей, т.е. создание достоверной и надежной иллюзии того, что каждый из пользователей работает с базой данных в одиночку.

В связи со свойством сохранения целостности базы данных транзакции являются подходящими единицами изолированности пользователей. Действительно, если с каждым сеансом работы пользователя или приложений с базой данных ассоциируется транзакция, то каждый пользователь начинает работу с согласованным состоянием базы данных, т.е. с таким состоянием, в котором база данных могла бы находиться, даже если бы пользователь работал с ней в одиночку.

При соблюдении обязательного требования поддержки целостности базы данных возможно наличие нескольких уровней изолированности транзакций. Заметим, что впервые эти уровни изолированности транзакций были установлены и описаны участниками проекта System R.

Отсутствие потерянных изменений (первый уровень изолированности)

Рассмотрим сценарий совместного выполнения двух транзакций, показанный на рис. 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). Отсутствие потерянных изменений является минимальным требованием к СУБД при обеспечении изолированности одновременно выполняемых транзакций.

Отсутствие чтения «грязных» данных (второй уровень изолированности)

Рассмотрим сценарий совместного выполнения транзакций T1иT2, показанный на рис. 13.2. В момент времениt1транзакцияT1изменяет объект базы данныхo(выполняет операциюW(o)). В момент времениt2 > t1транзакцияT2читает объектo(выполняет операциюR(o)). Поскольку транзакцияT1еще не завершена, транзакцияT2видит несогласованные«грязные» данные. В частности, в момент времениt3>t2транзакцияT1может завершиться откатом (например, по причине нарушения ограничений целостности).

Рис. 13.2.«Грязные» чтения

Эта ситуация тоже не соответствует требованию изолированности пользователей (каждый пользователь начинает свою транзакцию при согласованном состоянии базы данных и имеет право видеть только согласованные данные). Чтобы избежать ситуации чтения "грязных" данных, до завершения транзакции T1, изменившей объект базы данныхo, никакая другая транзакция не должна читать объектo(например, достаточно заблокировать доступ по чтению к объектуoдо завершения изменившей его транзакцииT1).