Уровень изоляции транзакций в SQL Server и их связь с грязными чтениями, неповторяемыми, фантомными чтениями и т.д. (аргументы кода и временные последовательности)
Понимая эти проблемы, которые могут возникнуть при одновременном доступе к базе данных, мы можем продолжать понимать понятие уровня изоляции базы данных простым языком: как вы хотите изолировать одновременные транзакции и в какой степени? Например, если можно терпеть грязные чтения или вы не хотите, чтобы параллельные транзакции были грязными, их можно установить на уровень изоляции, чтобы изоляция между одновременными транзакциями была слабой или серьёзной.
Чем выше уровень изоляции, тем меньше вероятность чтения грязных или неполных данных, но тем сильнее проявляется снижение производительности в системах с высокой параллелью. Чем ниже уровень изоляции, тем выше улучшение производительности в параллельной системе, но сами данные могут быть неполными.
В SQL Server 2012 вы можете установить уровень изоляции транзакции (от низкого к высокому) с помощью следующего синтаксиса:
УСТАНОВКА УРОВНЯ ИЗОЛЯЦИИ ТРАНЗАКЦИЙ { READ UNCOMMITTED | ЧИТАЙТЕ ПРИВЕРЖЕННОСТЬ | ПОВТОРЯЕМОЕ ЧТЕНИЕ | СНИМОК | СЕРИАЛИЗИРУЕМЫЙ } [ ; ] Сначала создайте новый тестовый скрипт, создайте базу данных и вставьте тестовые данные, следующим образом:
Создать новое окно A, откройте транзакцию, выполните операцию обновления и подождите 10 секунд перед коммитированием, код выглядит следующим образом:
Создать новое окно B, установите транзакцию READ UNCOMMITTED (uncommitted read, самый низкий уровень, лёгкая проблема — грязное считывание, так как данные могут считывать данные, изменённые другими транзакциями, но не коммитированные). Это делает то же самое, что и установка (NOLOCK) в таблице объектов операторов SELECT в транзакции. Запросите данные, код выглядит следующим образом:
Создать новое окно C, напрямую запросить данные следующим образом:
В свою очередь,Выполните окна A, B и C и обнаружите, что при обновлении данных окно B может сразу вернуть данные (Возможно, что данные — это грязные данные), окно C должно ждать, пока окно A завершит выполнениевернёт данные, как показано на рисунке ниже:
(Окно Б)
(Окно C)
(Конец)
|