OK, volví a casa y probé. Aquí está la observación.
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
Primera prueba con ambas configuraciones confirmadas como OFF.
Consulta 1
USE TEST;
BEGIN TRAN
UPDATE TABLE1
SET Details = 'Update'
WHERE ID = 1;
--COMMIT;
--ROLLBACK;
GO
Consulta 2
USE TEST;
SELECT ID, Details
FROM TABLE1
WHERE ID = 1;
GO
En esta prueba, la consulta 2 está esperando que se confirme la consulta 1, dm_tran_locks El DMV muestra ese bloqueo exclusivo en la TABLA 1 incurrido por la consulta 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'
Segunda prueba , deshaga la transacción anterior, configure READ_COMMITTED_SNAPSHOT ON pero deje ALLOW_SNAPSHOT_ISOLATION OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Ejecute la consulta 1 y la consulta 2. El DMV muestra que la consulta 1 tiene un bloqueo exclusivo, pero la consulta 2 devuelve detalles con 'Original' sin que la consulta 1 confirme la transacción. Parece que la versión de la fila READ_COMMITTED está en su lugar.
Al agregar la SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
consulta 1 y la consulta 2, y ejecutar la consulta 1 o la consulta 2, se produce un error: la transacción de aislamiento de instantánea no pudo acceder a la base de datos 'TEST' porque el aislamiento de instantánea no está permitido en esta base de datos. Use ALTER DATABASE para permitir el aislamiento de instantáneas.
Tercera prueba , deshacer la transacción anterior. Establezca READ_COMMITTED_SNAPSHOT OFF y 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
Ejecute la consulta 1 y luego la consulta 2. El DMV muestra el bloqueo exclusivo incurrido por la consulta 1. La consulta 2 parece estar esperando que se complete la consulta 1. Activar ALLOW_SNAPSHOT_ISOLATION ON no parece habilitar READ COMMITTED row versioning.
Agregar SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
tanto a la consulta 1 como a la consulta 2. Ejecute la consulta 1 y luego la consulta 2. Mientras el DMV muestra que la consulta 1 tiene un bloqueo exclusivo, la consulta 2 devuelve detalles con 'Original'. El aislamiento de la instantánea parece estar en su lugar.
La observación de la prueba muestra que READ_COMMITTED_SNAPSHOT
sí mismo habilita / deshabilita la versión READ COMMITTED de la fila independientemente de la ALLOW_SNAPSHOT_ISOLATION
configuración, y viceversa.