Уровни изоляции в ядре СУБД
Транзакции указывают уровень изоляции, который определяет степень, до которой одна транзакция должна быть изолирована от изменений ресурса или данных, произведенных другими транзакциями.
Уровни изоляции транзакций контролируют следующие параметры:
- Применение и типы блокировки при чтении данных.
- Время удержания блокировок чтения.
- Использование операции чтения ссылок на строки, измененные другой транзакцией.
- Блокировка до тех пор, пока не будет снята монопольная блокировка строки.
- Извлечение зафиксированной версии строки, которая существовала в то время, когда началось выполнение инструкции или транзакции.
- Считывание незафиксированного изменения данных.
Выбор уровня изоляции транзакции не влияет на блокировки, примененные для защиты изменений данных. Транзакция всегда вызывает монопольную блокировку любых данных, которые она изменяет, и держит блокировку до тех пор, пока транзакция не завершится, независимо от уровня изоляции, установленного для транзакции. Для операций чтения уровни изоляции транзакций, в основном, определяют уровень защиты от эффектов изменений, сделанных другими транзакциями.
Более низкий уровень изоляции увеличивает возможность получения доступа к данным несколькими пользователями одновременно, но увеличивает число негативных эффектов одновременного доступа (таких как «грязное» чтение или потерянные обновления), с которыми может столкнуться пользователь. Наоборот, более высокий уровень изоляции уменьшает число негативных эффектов одновременного доступа, с которыми может столкнуться пользователь, но требует больше системных ресурсов и увеличивает шанс того, что одна транзакция блокирует другую. Выбор соответствующего уровня изоляции зависит от баланса между требованиями к целостности данных приложения и издержек каждого уровня изоляции. Самый высокий уровень изоляции — изоляция упорядочиваемых транзакций — гарантирует, что транзакция извлечет в точности те же данные при каждой операции чтения, но достигается это применением уровня блокировки, при котором очень вероятно влияние на других пользователей в многопользовательских системах. Самый низкий уровень изоляции — изоляция незафиксированного чтения — может извлечь данные, которые были изменены, но не зафиксированы другой транзакцией. При изоляции незафиксированного чтения могут проявиться все негативные эффекты одновременного доступа, при таком уровне нет блокировки чтения или управления версиями, так что издержки минимальны.
Стандарт SQL-99 определяет следующие уровни изоляции, каждый из которых поддерживается компонентом Microsoft SQL Server Database Engine:
- изоляция незафиксированного чтения (самый низкий уровень, при котором транзакции изолируются до такой степени, чтобы только уберечь от считывания физически поврежденных данных);
- изоляция зафиксированного чтения (уровень компонента Database Engine по умолчанию);
- изоляция повторяющегося чтения;
- изоляция упорядочиваемых транзакций (самый высокий уровень, при котором транзакции полностью изолированы друг от друга).
SQL Server 2008 также поддерживает два уровня изоляции транзакций, которые используют управление версиями строк. Один является новой реализацией уровня изоляции зафиксированного чтения, а второй - изоляция моментального снимка.
- Если параметру базы данных READ_COMMITTED_SNAPSHOT присвоено значение ON, уровень изоляции зафиксированного чтения использует управление версиями строк для обеспечения согласованности считывания на уровне инструкций. Операции чтения требуют применения только блокировок уровня таблицы SCH-S и не допускают применения блокировок строк или страниц. Если параметр базы данных READ_COMMITED_SNAPSHOT установлен в OFF (значение по умолчанию), то изоляция зафиксированного чтения работает так же, как и в предыдущих версиях SQL Server. Обе реализации согласуются с определением ANSI для уровня изоляции зафиксированного чтения.
- Уровень изоляции моментальных снимков использует управление версиями строк для обеспечения согласованности чтения на уровне транзакций. Операции чтения применяют только блокировки таблицы SCH-S и не применяют блокировок строк или страниц. Если считываемые строки изменены другой транзакцией, то извлекается версия строки, которая существовала в момент запуска транзакции. Изоляция моментальных снимков включается, если параметр базы данных ALLOW_SNAPSHOT_ISOLATION установлен в ON. По умолчанию для пользовательских баз данных этот параметр установлен в OFF.