OK, ging nach Hause und getestet. Hier ist die Beobachtung.
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
Erster Test mit beiden Einstellungen als AUS bestätigt.
Abfrage 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Abfrage 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
In diesem Test wartet Abfrage 2 darauf, dass Abfrage 1 festgeschrieben wird. Dm_tran_locks DMV zeigt diese exklusive Sperre für TABLE1 an, die von Abfrage 1 verursacht wurde.
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'
Zweiter Test , vorherige Transaktion zurücksetzen, READ_COMMITTED_SNAPSHOT auf ON setzen, ALLOW_SNAPSHOT_ISOLATION jedoch auf OFF lassen.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Führen Sie Abfrage 1 und Abfrage 2 aus. DMV zeigt, dass Abfrage 1 eine exklusive Sperre aufweist, Abfrage 2 jedoch Details mit "Original" zurückgibt, ohne dass Abfrage 1 die Transaktion festschreibt. Es scheint, dass die READ_COMMITTED-Zeilenversionierung vorhanden ist.
Wenn Sie SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
Abfrage 1 und Abfrage 2 hinzufügen und Abfrage 1 oder Abfrage 2 ausführen, wird ein Fehler zurückgegeben. Die Snapshot-Isolationstransaktion konnte nicht auf die Datenbank 'TEST' zugreifen, da die Snapshot-Isolation in dieser Datenbank nicht zulässig ist. Verwenden Sie ALTER DATABASE, um die Snapshot-Isolierung zu ermöglichen.
Dritter Test , Rollback der vorherigen Transaktion. Setzen Sie READ_COMMITTED_SNAPSHOT OFF und 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
Führen Sie Abfrage 1 und dann Abfrage 2 aus. DMV zeigt die von Abfrage 1 verursachte exklusive Sperre an. Abfrage 2 wartet anscheinend auf den Abschluss von Abfrage 1. Durch Aktivieren von ALLOW_SNAPSHOT_ISOLATION wird die READ COMMITTED-Zeilenversionierung nicht aktiviert.
Hinzufügen SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
zu Abfrage 1 und Abfrage 2. Führen Sie Abfrage 1 und dann Abfrage 2 aus. Während in DMV für Abfrage 1 eine exklusive Sperre angezeigt wird, gibt Abfrage 2 Details mit "Original" zurück. Die Snapshot-Isolierung scheint vorhanden zu sein.
Die Beobachtung des Tests zeigt, dass READ_COMMITTED_SNAPSHOT
die READ COMMITTED-Zeilenversionierung unabhängig von der ALLOW_SNAPSHOT_ISOLATION
Einstellung aktiviert / deaktiviert wird und umgekehrt.