OK, rentra chez moi et testé. Voici l'observation.
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
Premier test avec confirmation des deux paramètres sur OFF.
Requête 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Requête 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
Dans ce test, la requête 2 attend que la requête 1 soit validée, dm_tran_locks DMV montre ce verrouillage exclusif sur TABLE1 engagé par la requête 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'
Deuxième test , annuler la transaction précédente, définissez READ_COMMITTED_SNAPSHOT sur ON, mais laissez ALLOW_SNAPSHOT_ISOLATION sur OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Exécuter la requête 1, puis la requête 2. DMV indique que la requête 1 est soumise à un verrou exclusif, mais que la requête 2 renvoie les détails avec "Original" sans que la requête 1 valide la transaction. Il semble que la gestion des versions de ligne READ_COMMITTED est en place.
L'ajout SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
aux requêtes 1 et 2 et l'exécution de la requête 1 ou de la requête 2 renvoie une erreur. La transaction d'isolation de capture instantanée n'a pas pu accéder à la base de données 'TEST' car l'isolation de capture instantanée n'est pas autorisée dans cette base de données. Utilisez ALTER DATABASE pour autoriser l'isolation de cliché.
Troisième test , annuler la transaction précédente. Définissez READ_COMMITTED_SNAPSHOT OFF et 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
Exécutez la requête 1, puis la requête 2. DMV indique le verrou exclusif généré par la requête 1. La requête 2 semble attendre que la requête 1 soit terminée. L'activation de ALLOW_SNAPSHOT_ISOLATION ne semble pas activer le contrôle de version des lignes READ COMMITTED.
Ajout SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
à la fois à la requête 1 et à la requête 2. Exécutez la requête 1, puis la requête 2. Tandis que DMV indique que la requête 1 a un verrou exclusif, la requête 2 renvoie les détails avec le mot 'Original'. L'isolation de l'instantané semble être en place.
L'observation du test montre qu'elle READ_COMMITTED_SNAPSHOT
active / désactive elle - même le contrôle de version des lignes READ COMMITTED, quel que soit le ALLOW_SNAPSHOT_ISOLATION
paramètre défini, et inversement.