OK, voltei para casa e testei. Aqui está a observação.
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
Primeiro teste com as duas configurações 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
Nesse teste, a consulta 2 está aguardando a confirmação da consulta 1, dm_tran_locks DMV mostra esse bloqueio exclusivo na TABLE1 incorrido pela 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'
Segundo teste , reversão da transação anterior, defina READ_COMMITTED_SNAPSHOT ON, mas deixe ALLOW_SNAPSHOT_ISOLATION OFF.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT ON
WITH ROLLBACK IMMEDIATE;
GO
Execute a Consulta 1 e execute a consulta 2. O DMV mostra a consulta 1 com bloqueio exclusivo, mas a consulta 2 retorna detalhes com 'Original' sem a consulta 1 confirmar a transação. Parece que o controle de versão da linha READ_COMMITTED está em vigor.
Adicionar SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
a consulta 1 e a consulta 2 e executar a consulta 1 ou a consulta 2 retorna erro - A transação de isolamento de captura instantânea falhou ao acessar o banco de dados 'TEST' porque o isolamento de captura instantânea não é permitido nesse banco de dados. Use ALTER DATABASE para permitir o isolamento de instantâneo.
Terceiro teste , reversão da transação anterior. Ative READ_COMMITTED_SNAPSHOT e ALLOW_SNAPSHOT_ISOLATION.
ALTER DATABASE TEST
SET READ_COMMITTED_SNAPSHOT OFF
WITH ROLLBACK IMMEDIATE;
GO
ALTER DATABASE TEST
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
Execute a consulta 1 e, em seguida, a consulta 2. O DMV mostra o bloqueio exclusivo incorrido pela consulta 1. A consulta 2 parece estar aguardando a conclusão da consulta 1. Ativar ALLOW_SNAPSHOT_ISOLATION ON não parece ativar o controle de versão READ COMMITTED.
Adicionando SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
à consulta 1 e à consulta 2. Execute a consulta 1 e, em seguida, a consulta 2. Enquanto o DMV mostra a consulta 1 com bloqueio exclusivo, a consulta 2 retorna os detalhes com 'Original'. O isolamento de instantâneo parece estar no lugar.
A observação do teste mostra que READ_COMMITTED_SNAPSHOT
ela própria ativa / desativa o controle de versão da linha READ COMMITTED independentemente da ALLOW_SNAPSHOT_ISOLATION
configuração e vice-versa.