OK, wróciłem do domu i przetestowałem. Oto obserwacja.
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
Pierwszy test z obydwoma ustawieniami potwierdzonymi jako WYŁ.
Zapytanie 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Zapytanie 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
W tym teście zapytanie 2 oczekuje na zatwierdzenie zapytania 1, dm_tran_locks DMV pokazuje, że blokada wyłączności na TABELI 1 została wywołana przez zapytanie 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'
Drugi test , wycofaj poprzednią transakcję, ustaw READ_COMMITTED_SNAPSHOT na ON, ale pozostaw ALLOW_SNAPSHOT_ISOLATION na OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Uruchom zapytanie 1 i zapytanie 2. DMV pokazuje, że zapytanie 1 otrzymuje wyłączną blokadę, ale zapytanie 2 zwraca szczegóły z „Oryginalnym” bez zapytania 1 zatwierdzenia transakcji. Wygląda na to, że istnieje wersja READ_COMMITTED.
Dodanie SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
do zapytania 1 i zapytania 2 oraz uruchomienie zapytania 1 lub zapytania 2 zwraca błąd - Transakcja izolacji migawki nie powiodła się podczas uzyskiwania dostępu do bazy danych „TEST”, ponieważ izolacja migawki nie jest dozwolona w tej bazie danych. Użyj ALTER DATABASE, aby umożliwić izolację migawki.
Trzeci test , wycofaj poprzednią transakcję. Ustaw READ_COMMITTED_SNAPSHOT w pozycji OFF i ALLOW_SNAPSHOT_ISOLATION w pozycji ON.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT OFF
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE TEST
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
Uruchom zapytanie 1, a następnie zapytanie 2. DMV pokazuje wyłączną blokadę wywołaną przez zapytanie 1. Wydaje się, że zapytanie 2 oczekuje na zakończenie zapytania 1. Włączenie opcji ALLOW_SNAPSHOT_ISOLATION ON nie wydaje się włączać wersji dla READ COMMITTED.
Dodawanie SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
zarówno do zapytania 1, jak i zapytania 2. Uruchom zapytanie 1, a następnie zapytanie 2. Podczas gdy DMV pokazuje, że zapytanie 1 ma wyłączną blokadę, zapytanie 2 zwraca szczegóły za pomocą „Oryginału”. Wydaje się, że izolacja migawki jest na miejscu.
Obserwacja z testu pokazuje, że READ_COMMITTED_SNAPSHOT
samo włącza / wyłącza READ COMMITTED wersjonowanie wierszy, niezależnie od ALLOW_SNAPSHOT_ISOLATION
ustawienia, i odwrotnie.