Достаточно
легко убедиться, что при соблюдении двухфазного протокола синхронизационных
захватов действительно обеспечивается полная сериализация транзакций. Однако
иногда приложению, которое выполняет транзакцию, не сколько важны точные данные,
сколько скорость выполнения запросов. Например, в системах поддержки принятия
решении но электронным торгам важно просто иметь представление об общей картине
торгов, на основании которого принимается решение об повышении или снижении
ставок и т. д. Для смягчения требований сериализации транзакций вводится понятие
уровня изолированности пользователя.
Уровни изолированности
пользователей связаны с проблемами, которые возникают при параллельном выполнении
транзакций и которые были рассмотрены нами ранее.
Всего введено
4 уровня изолированности пользователей. Самый высокий уровень изолированности
соответствует протоколу сериализации транзакций, это уровень SERIALIZABLE. Этот
уровень обеспечивает полную изоляцию транзакций и полную корректную обработку
параллельных транзакций.
Следующий
уровень изолированности называется уровнем подтвержденного чтения — REPEATABLE
READ. На этом уровне транзакция не имеет доступа к промежуточным или окончательным
результатам других транзакций, поэтому такие проблемы, как пропавшие обновления,
промежуточные или несогласованные данные, возникнуть не могут. Однако во время
выполнения своей транзакции вы можете увидеть строку, добавленную в БД другой
транзакцией. Поэтому один и тот же запрос, выполненный в течение одной транзакции,
может дать разные результаты, то есть проблема строк-призраков остается. Однако
если такая проблема критична, лучше ее разрешать алгоритмически, изменяя алгоритм
обработки, исключая повторное выполнение запроса в одной транзакции.
Второй уровень
изолированности связан с подтвержденным чтением, он называется READ COMMITED.
На этом уровне изолированности транзакция не имеет доступа к промежуточным результатам
других транзакций, поэтому проблемы пропавших обновлений и промежуточных данных
возникнуть не могут. Однако окончательные данные, полученные в ходе выполнения
других транзакций, могут быть доступны нашей транзакции. При этом уровне изолированности
транзакция не может обновлять строку, уже обновленную другой транзакцией. При
попытке выполнить подобное обновление транзакция будет отменена автоматически,
во .избежание возникновения проблемы пропавшего обновления.
И наконец,
самый низкий уровень изолированности называется уровнем неподтвержденного, или
грязного, чтения. Он обозначается как READ UNCOMMITED. При этом уровне изолированности
текущая транзакция видит промежуточные и несогласованные данные, и также ей
доступны строки-призраки. Однако даже при этом уровне изолированности СУБД предотвращает
пропавшие обновления.
В стандарте
SQL2 существует оператор задания уровня изолированности выполнения транзакции.
Он имеет следующий синтаксис:
SET TRANSACTION IZGLATION LEVEL [{SERIALIZABLE |
REPEATABLE READ |
READ COMMITED
|
READ UNCOMMITED}] [{READ WRITE |
READ ONLY }]
Дополнительно
в этом операторе может быть указано, операции какого типа выполняются в транзакции.
По умолчанию предполагается уровень SERIALIZABLE. Если задан уровень READ UNCOMMITED,
то допустимы только операции чтения в транзакции, поэтому в этом случае нельзя
установить операции READ WRITE. На рис. 11.11 приведено соответствие уровней
изолированности транзакций и про-, блем, возникающих при параллельном выполнении
транзакций.
Рис.11.11.
Уровни изолированности транзакций и проблемы многопользовательской
работы
В разных
коммерческих СУБД могут быть реализованы не все уровни изолированности, это
необходимо выяснить в технической документации.