Большинство форумов и примеров в Интернете всегда предлагают включить оба варианта ALLOW_SNAPSHOT_ISOLATION
и READ_COMMITTED_SNAPSHOT
включить их, когда кто-то задает моментальный снимок, версию строки или аналогичный вопрос.
Я думаю, слово SNAPSHOT в обоих случаях немного сбивает с толку. Я подумал, что для того, чтобы ядро базы данных использовало управление версиями строк вместо блокировок для поведения по умолчанию READ_COMMITTED, база данных READ_COMMITTED_SNAPSHOT
установлена на ON независимо от того, какой ALLOW_SNAPSHOT_ISOLATION
параметр.
Параметр ALLOW_SNAPSHOT_ISOLATION
установлен на ON только для обеспечения изоляции моментального снимка при запуске транзакции (например, SET SNAPSHOT УРОВНЯ ИЗОЛЯЦИИ ТРАНЗАКЦИИ) независимо от READ_COMMITTED_SNAPSHOT
настройки.
Единственная причина, по которой эти два параметра должны быть установлены в положение «ВКЛ», - это когда им нужно иметь READ COMMITTED для версий строк и изоляции моментальных снимков.
Мой вопрос, является ли мое понимание неверным в некотором роде? И что эти два параметра всегда должны быть включены в ON (особенно для READ COMMITTED для версий строк)?
ОК, вернулся домой и проверил. Вот наблюдение.
Первый тест с обоими настройками подтвержден как выключенный.
Запрос 1
Запрос 2
В этом тесте запрос 2 ожидает подтверждения запроса 1, DMV dm_tran_locks показывает, что исключительная блокировка для TABLE1 возникла в результате запроса 1.
Во втором тесте , откат предыдущей транзакции, установите READ_COMMITTED_SNAPSHOT на ON, но оставьте ALLOW_SNAPSHOT_ISOLATION OFF.
Запустите запрос 1 и запустите запрос 2. DMV показывает запрос 1 с эксклюзивной блокировкой, но запрос 2 возвращает детали с параметром «Оригинал» без запроса 1, фиксирующего транзакцию. Похоже, что версия READ_COMMITTED строки на месте.
При добавлении
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
запроса 1 и запроса 2 и выполнении запроса 1 или запроса 2 возвращается ошибка - транзакция изоляции моментального снимка не смогла получить доступ к базе данных «TEST», поскольку изоляция моментального снимка не разрешена в этой базе данных. Используйте ALTER DATABASE, чтобы разрешить изоляцию снимка.Третий тест , откат предыдущей транзакции. Установите READ_COMMITTED_SNAPSHOT OFF и ALLOW_SNAPSHOT_ISOLATION ON.
Запустите запрос 1, а затем запрос 2. DMV показывает исключительную блокировку, вызванную запросом 1. Похоже, что запрос 2 ожидает завершения запроса 1. Включение ALLOW_SNAPSHOT_ISOLATION ON, по-видимому, не позволяет READ COMMITTED версионирование строк.
Добавление
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
как к запросу 1, так и к запросу 2. Запустите запрос 1, а затем запрос 2. В то время как DMV показывает, что запрос 1 подвергается эксклюзивной блокировке, запрос 2 возвращает детали с параметром «Оригинал». Снимок изоляции, кажется, на месте.Наблюдение из теста показывает, что
READ_COMMITTED_SNAPSHOT
сам по себе включает / отключает версию чтения READ COMMITTED независимо отALLOW_SNAPSHOT_ISOLATION
настроек, и наоборот.источник
Ваше понимание верно. Мне нравится краткое, чистое и простое определение отсюда :
Похоже, много недоразумений исходит от самой MS. Например, здесь они говорят:
Но упомянутая «изоляция моментального снимка» не равна поведению транзакции, для которой
set transaction isolation level snapshot
применяется.Что касается разницы, хорошее объяснение здесь .
Возможно, было бы лучше, если бы READ_COMMITTED_SNAPSHOT было названо READ_COMMITTED_ROW_VERSIONING или что-то в этом роде. :)
источник
Мне нравится это резюме от Microsoft :
источник