Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курс лекций СБД.doc
Скачиваний:
24
Добавлен:
13.11.2019
Размер:
1.94 Mб
Скачать
      1. Согласованность и уровень изоляции транзакций

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

Рассмотрим команду на обновление:

UPDATE Поставщики SET Статус := 50 WHERE Гор = ‘Брест’;

Предположим, что в таблице Поставщики имеется 500 строк, и в 50 из них атрибут Гор имеет значение ‘Брест’. Чтобы найти псе эти 50 строк, СУБД потребуется некоторое время. Будет ли на протяжении этого времени разрешено другим транзакциям обновлять поля Гор и Статус в этой таблице? Если SQL-команда является согласованной, то такие обновления будут запрещены. Обновление будет применено к набору строк в том виде, в каком они существовали в момент запуска SQL-команды. Такая согласованность называется согласованностью на уровне команды (statement level consistency).

Теперь рассмотрим транзакцию, которая содержит два оператора обновления:

BEGIN TRANSACTION UPDATE Поставщики SET Статус := 50 WHERE Гор = ‘Брест’ UPDATE Поставщики SET Имя_П :='Имя_П'’-Брест’ WHERE Статус = 50;

Согласованность на уровне оператора означает, что каждый из двух операторов обрабатывает строки согласованно, но в интервале между ними указанные строки могут изменяться другими пользователями. Согласованность на уровне транзакции (transaction level consistency) означает, что все строки, затронутые любым из SQL-операторов, защищены от изменений на протяжении всей транзакции.

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

Еще более сложной является ситуация с термином изолированность.

Блокировки предотвращают потерю изменений при параллельной обработке. Тем не менее, существует ряд проблем, которые они предотвратить не в состоянии. Перечислим такие проблемы.

Грязное чтение (dirty read) – чтение транзакцией записи, которая изменена, но еще не записана в базу данных. Это может произойти, например, когда одна транзакция считывает строку, измененную другой незавершенной транзакцией, а эта другая транзакция впоследствии отменяется.

Невоспроизводимое чтение (nonrepeatable reads) – это ситуация, когда при повторном чтении данных, уже считанных ранее, транзакция обнаруживает модификации или удаления, вызванные другой завершенной транзакцией.

Фантомное чтение (phantom reads) – это ситуация, когда при повторном чтении данных транзакция обнаруживает новые строки, вставленные другой завершенной транзакцией после предыдущего чтения.

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

Уровень изоляции «незавершенное чтение» (read uncommited) допускает грязное чтение, невоспроизводимое чтение и фантомное чтение. Уровень изоляции «завершенное чтение» (read committed) предотвращает грязное чтение и разрешает невоспроизводимое чтение и фантомное чтение. Уровень изоляции «воспроизводимое чтение» (repeatable read) предотвращает «грязное» чтение и невоспроизводимое чтение и разрешает только фантомное чтение. Уровень изоляции «сериализуемостъ» (serializable) не допускает возникновения ни одной из этих трех проблем.