Não consigo encontrar detalhes sobre como SNAPSHOT ISOLATION
funciona. Testei a seguinte consulta no SQL Server 2019 (com o ADR desabilitado):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN;
WAITFOR DELAY '00:00:20'; -- insert of one record to dbo.MARA_CT in different session
SELECT
*
FROM dbo.MARA_CT AS mc;
WAITFOR DELAY '00:00:20'; -- insert of one record to dbo.Album in different session
SELECT
*
FROM dbo.Album AS a;
WAITFOR DELAY '00:00:20';
SELECT
*
FROM dbo.MARA_CT AS mc;
SELECT
*
FROM dbo.Album AS a;
COMMIT;
Conforme observado no comentário, inseri uma linha em dbo.MARA_CT
e, durante a segunda WAITFOR DELAY
, inseri um registro em dbo.Album
. De acordo com a documentação da Microsoft:
The term "snapshot" reflects the fact that all queries in the transaction see the same version, or snapshot, of the database, based on the state of the database at the moment in time when the transaction begins.
Os resultados que obtive da minha consulta são os seguintes:
dbo.MARA_CT
contém o registro inserido durante o primeiro WAITFOR DELAY '00:00:20'.dbo.Album
não contém o registro inserido durante o segundo WAITFOR DELAY '00:00:20'.
Parece-me que o "primeiro contato" com qualquer tabela na consulta cria um "instantâneo" de toda a transação, em vez de capturar o estado do banco de dados no momento em que a transação começa. Em relação a isso SNAPSHOT ISOLATION
, tenho perguntas adicionais:
O ISOLAMENTO DE SNAPSHOT armazena todas as versões desde o início da transação para todas as linhas do banco de dados ou apenas para as tabelas usadas na consulta? Como isso funciona?
Se o RCSI estiver habilitado e posteriormente habilitarmos o ISOLAMENTO DE SNAPSHOT, o SQL Server armazenará novos valores/versões no tempdb?
O objetivo do uso,
SNAPSHOT ISOLATION
no meu caso, é testar novas versões de procedimentos e visualizações (novo esquema). Tanto os procedimentos novos quanto os antigos precisam retornar o mesmo número de registros e utilizar os mesmos dados, mesmo que as tabelas envolvidas passem por constantes inserções, atualizações e exclusões. Considerei usar um snapshot do banco de dados, mas agora vejo queSNAPSHOT ISOLATION
pode ser ainda mais vantajoso, já que o RCSI já está habilitado nos bancos de dados.