Поделиться через


Уровни изоляции в ядре СУБД

Транзакции указывают уровень изоляции, который определяет степень, до которой одна транзакция должна быть изолирована от изменений ресурса или данных, произведенных другими транзакциями. Уровни изоляции описаны с точки зрения того, какие из побочных эффектов параллелизма разрешены (например, «грязные» чтения или фантомные чтения).

Уровни изоляции транзакций контролируют следующие параметры.

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

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

Более низкий уровень изоляции увеличивает возможность получения доступа к данным несколькими пользователями одновременно, но увеличивает число эффектов параллелизма (таких как «грязное» чтение или потерянные обновления), с которыми может столкнуться пользователь. Наоборот, более высокий уровень изоляции уменьшает число эффектов параллелизма, с которыми может столкнуться пользователь, но требует больше системных ресурсов и увеличивает шанс того, что одна транзакция блокирует другую. Выбор соответствующего уровня изоляции зависит от баланса между требованиями к целостности данных приложения и издержек каждого уровня изоляции. Самый высокий уровень изоляции — изоляция упорядочиваемых транзакций — гарантирует, что транзакция извлечет в точности те же данные при каждой операции чтения, но достигается это применением уровня блокировки, при котором очень вероятно влияние на других пользователей в многопользовательских системах. Самый низкий уровень изоляции — изоляция незафиксированного чтения — может извлечь данные, которые были изменены, но не зафиксированы другой транзакцией. При изоляции незафиксированного чтения могут проявиться все эффекты параллелизма, но при таком уровне нет блокировки чтения или управления версиями, так что издержки минимальны.

Уровни изоляции ядра СУБД

Стандарт SQL-99 определяет следующие уровни изоляции, каждый из которых поддерживается компонентом Microsoft SQL Server Database Engine:

  • изоляция незафиксированного чтения (самый низкий уровень, при котором транзакции изолируются до такой степени, чтобы только уберечь от считывания физически поврежденных данных);
  • изоляция зафиксированного чтения (уровень компонента Database Engine по умолчанию);
  • изоляция повторяющегося чтения;
  • изоляция упорядочиваемых транзакций (самый высокий уровень, при котором транзакции полностью изолированы друг от друга).

SQL Server 2005 также поддерживает два уровня изоляции транзакций, которые используют управление версиями строк. Один является новой реализацией уровня изоляции зафиксированного чтения, а второй — новый уровень изоляции, изоляция моментального снимка.

  • Если параметру базы данных READ_COMMITTED_SNAPSHOT присвоено значение ON, уровень изоляции зафиксированного чтения использует управление версиями строк для обеспечения согласованности считывания на уровне инструкций. Операции чтения требуют применения только блокировок уровня таблицы SCH-S и не допускают применения блокировок строк или страниц. Если параметр базы данных READ_COMMITED_SNAPSHOT установлен в OFF (значение по умолчанию), то изоляция зафиксированного чтения работает так же, как и в предыдущих версиях SQL Server. Обе реализации согласуются с определением ANSI для уровня изоляции зафиксированного чтения.
  • Уровень изоляции моментальных снимков использует управление версиями строк для обеспечения согласованности чтения на уровне транзакций. Операции чтения применяют только блокировки таблицы SCH-S и не применяют блокировок строк или страниц. Если считываемые строки изменены другой транзакцией, то извлекается версия строки, которая существовала в момент запуска транзакции. Изоляция моментальных снимков включается, если параметр базы данных ALLOW_SNAPSHOT_ISOLATION установлен в ON. По умолчанию для пользовательских баз данных этот параметр установлен в OFF.

Следующая таблица показывает побочные эффекты параллелизма, допускаемые различными уровнями изоляции.

Уровень изоляции «Грязное» чтение Неповторяющееся чтение Фантомное чтение

незафиксированного чтения

Да

Да

Да

зафиксированного чтения

Нет

Да

Да

повторяющегося чтения

Нет

Нет

Да

моментального снимка

Нет

Нет

Нет

упорядочиваемых транзакций

Нет

Нет

Нет

Дополнительные сведения о конкретных типах блокировки или управления версиями строк, контролируемых каждым уровнем изоляции транзакций, см. в разделе SET TRANSACTION ISOLATION LEVEL (Transact-SQL).

См. также

Основные понятия

Эффекты параллелизма
Типы управления параллелизмом

Другие ресурсы

ALTER DATABASE (Transact-SQL)

Справка и поддержка

Получение помощи по SQL Server 2005