ОК, вернулся домой и проверил. Вот наблюдение.
CREATE DATABASE TEST;
GO
CREATE TABLE TABLE1
(
ID tinyint,
Details varchar(10)
);
GO
INSERT INTO TABLE1
VALUES (1, 'Original');
GO
SELECT
name,
snapshot_isolation_state_desc,
is_read_committed_snapshot_on
FROM sys.databases
WHERE name = 'TEST';
GO
Первый тест с обоими настройками подтвержден как выключенный.
Запрос 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Запрос 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
В этом тесте запрос 2 ожидает подтверждения запроса 1, DMV dm_tran_locks показывает, что исключительная блокировка для TABLE1 возникла в результате запроса 1.
USE TEST;
SELECT
DB_NAME(tl.resource_database_id) AS DBName,
resource_type,
OBJECT_NAME(resource_associated_entity_id) AS tbl_name,
request_mode,
request_status,
request_session_id
FROM sys.dm_tran_locks tl
WHERE
resource_database_id = db_id('TEST')
AND resource_type = 'OBJECT'
Во втором тесте , откат предыдущей транзакции, установите READ_COMMITTED_SNAPSHOT на ON, но оставьте ALLOW_SNAPSHOT_ISOLATION OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Запустите запрос 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.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT OFF
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE TEST
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
Запустите запрос 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
настроек, и наоборот.