Não consigo entender qual transação será confirmada primeiro.
BEGIN TRANSACTION T1
UPDATE mcnnew SET id =3 WHERE id=4
BEGIN TRANSACTION T2
DELETE FROM mcnnew WHERE id=3
COMMIT TRANSACTION T2
COMMIT TRANSACTION T1
A consulta não quebra a conformidade ACID. As linhas/páginas/tabela (dependendo do seu banco de dados) são bloqueadas durante a execução (ou, na verdade, até a
COMMIT
declaração mais externa).Seu:
id IN (3, 4)
serão removidas.Essa consulta seria funcionalmente a mesma se você removesse
BEGIN TRANSACTION T2
eCOMMIT TRANSACTION T2
.O ponto de ter uma transação aninhada como essa é que você pode reverter parte do trabalho se quiser (por exemplo, se descobrir que algo deu errado com sua atualização inicial).
Para complementar o que @Daniel postou em sua resposta , eu diria que:
Existe apenas uma Transação. O segundo
BEGIN TRAN
apenas incrementa o@@TRANCOUNT
, que é meramente decrementado por todos, exceto o último / mais externoCOMMIT
.Se houvesse transações aninhadas verdadeiras, não faria sentido, mesmo conceitualmente, que qualquer sistema permitisse confirmar alterações fora de sequência da ordem em que foram executadas.
Por favor, veja minha resposta para a seguinte pergunta, também aqui no DBA.SE, que detalha como as transações funcionam:
Como reverter quando 3 procedimentos armazenados são iniciados a partir de um procedimento armazenado