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.
Sim, este é o comportamento documentado . A transação de snapshot torna-se ativa com o primeiro acesso aos dados do usuário.
As versões são geradas sempre que a opção de banco de dados RCSI ou SI estiver habilitada. Isso é bastante geral e se aplica a todos os dados do usuário. Não importa se RCSI ou SI está sendo usado.
Por exemplo, se a sua transação for executada por 5 horas, as versões de todas as tabelas alteradas no banco de dados serão mantidas por 5 horas. O SQL Server precisa fazer isso; ele não tem como saber quais dados (como eram 5 horas atrás) sua transação acessará em seguida.
Não, mas as versões podem ser necessárias por mais tempo.
Não parece ser uma pergunta.
Consulte o guia Bloqueio de transações e controle de versão de linhas .