Eu estive procurando alguns procedimentos armazenados em nosso sistema hoje quando vi a seguinte estrutura:
(pseudocódigo indicativo do SP real, o servidor está usando o nível de isolamento padrão):
CREATE PROCEDURE ...
AS
BEGIN
IF NOT EXISTS(SELECT ...)
BEGIN
RETURN;
END
BEGIN TRAN
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
DML...
DML...
DML...
COMMIT
END
Eu não vi o nível de isolamento da transação sendo declarado dentro de um limite de transação e queria saber qual era o efeito disso?
O nível de isolamento é restaurado depois que a transação é confirmada (portanto, se houvesse instruções adicionais após a confirmação - qual seria o nível de isolamento)?
Nesse caso, suponho que não haveria diferença se o nível de isolamento fosse declarado pouco antes do início da transação. É esse o caso?
Principalmente, fiquei um pouco surpreso ao ver isso, pois só vi o isolamento de transação declarado fora de uma transação, não dentro e estava me perguntando - por quê? Quais são os benefícios de fazê-lo.
Abaixo estão trechos relevantes da documentação SET TRANSACTION ISOLATION LEVEL .
Segue dizendo:
Observe que não há menção a
BEGIN TRANSACTION
,COMMIT
, etc. Essas instruções de controle de transação não afetam o nível de isolamento da transação da sessão atual.Não vejo uma diferença funcional em especificar o nível de isolamento da transação imediatamente após o
BEGIN TRAN
. Talvez o desenvolvedor quisesse ter certeza de que o nível fosse óbvio para o leitor e achasse que o melhor lugar era no limite da transação, em vez de ter que visualizar o início do código proc.