Добре, повернувся додому і випробував. Ось спостереження.
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 здійсниться, dm_tran_locks DMV показує, що ексклюзивний замок на 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 вимкнено.
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 не відображається, щоб увімкнути ПРОЧИТАНО КОМИТИРОВАНО версію рядків.
Додавання SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
до запиту 1 та запиту 2. Запустіть запит 1, а потім запит 2. Поки DMV показує, що запит 1 містить ексклюзивний замок, запит 2 повертає деталі з "Оригінал". Здається, ізоляція знімків на місці.
Спостереження з тесту показує, що READ_COMMITTED_SNAPSHOT
саме воно вмикає / відключає версію рядків READ COMMITTED незалежно від ALLOW_SNAPSHOT_ISOLATION
налаштування, і навпаки.