Уровни изоляции в компоненте Database Engine

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

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

  • Применение и типы блокировки при чтении данных.

  • Время удержания блокировок чтения.

  • Использование операции чтения ссылок на строки, измененные другой транзакцией.

    • Блокировка до тех пор, пока не будет снята монопольная блокировка строки.

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

    • Считывание незафиксированного изменения данных.

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

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

Уровни изоляции компонента Database Engine

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

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

  • уровень изоляции read committed (уровень компонента Database Engine по умолчанию);

  • изоляция повторяющегося чтения;

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

Важное примечаниеВажно!

Операции DDL и транзакции с реплицированными таблицами могут завершиться ошибкой, если запрашивается сериализуемый уровень изоляции. Это происходит вследствие того, что запросы репликации используют подсказки, которые могут оказаться несовместимыми с сериализуемым уровнем изоляции.

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

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

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

ПримечаниеПримечание

SQL Server не поддерживает управление версиями метаданных. Поэтому, не все операции DDL могут выполняться в явной транзакции, работающей с уровнем изоляции моментального снимка. Следующие инструкции DDL недопустимы в транзакции, работающей при изоляции моментального снимка, после инструкции BEGIN TRANSACTION: ALTER TABLE, CREATE INDEX, CREATE XML INDEX, ALTER INDEX, DROP INDEX, DBCC REINDEX, ALTER PARTITION FUNCTION, ALTER PARTITION SCHEME и любые инструкции DDL среды CLR. Эти инструкции разрешены к использованию в неявных транзакциях, работающих при уровне изоляции моментального снимка. Неявная транзакция, по определению, это единственная инструкция, для которой возможно выполнение семантики изоляции моментального снимка, даже для инструкций DDL. Нарушение этого принципа может вызвать сообщение об ошибке 3961: «Ошибка транзакции в режиме изоляции моментального снимка в базе данных "%.*ls": объект, к которому производится обращение в данной инструкции, был изменен инструкцией DDL другой, параллельной транзакции, после начала данной транзакции. Это запрещено, поскольку управление версиями метаданных не поддерживается. Одновременное обновление метаданных может привести к несогласованности при совместном использовании с режимом изоляции моментального снимка».

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

Уровень изоляции

«Грязное» чтение

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

Фантомное чтение

Незафиксированная операция чтения

Да

Да

Да

Зафиксированная операция чтения

Нет

Да

Да

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

Нет

Нет

Да

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

Нет

Нет

Нет

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

Нет

Нет

Нет

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