Corretamente escopo transações em Stored Procs
-
01-07-2019 - |
Pergunta
Suponha que eu tenho um procedimento armazenado que gerencia sua própria transação
CREATE PROCEDURE theProc
AS
BEGIN
BEGIN TRANSACTION
-- do some stuff
IF @ThereIsAProblem
ROLLBACK TRANSACTION
ELSE
COMMIT TRANSACTION
END
Se eu chamar este proc de uma transação existente, o proc pode reverter a transação externa.
BEGIN TRANSACTION
EXEC theProc
COMMIT TRANSACTION
Como eu corretamente escopo da transação dentro do procedimento armazenado, de modo que o procedimento armazenado não transações de reversão externos?
Solução
A sintaxe para fazer isso varia provavelmente pelo banco de dados. Mas, em Transact-SQL que você faz é verificar @@ TRANCOUNT para ver se você estiver em uma transação. Se estiver, então você deseja criar um ponto de salvamento, e no final você pode apenas passar pelo fim da função (acreditando que uma confirmação ou reversão vai acontecer mais tarde) ou então reversão para o seu ponto de salvamento.
documentação See da Microsoft sobre savepoints para mais.
Suporte para pontos de salvamento é bastante difundida, mas acho que o mecanismo (assumindo que há um) para descobrir que você está atualmente em uma transação irá variar um pouco.
Outras dicas
uso @@ trancount para ver se você já estiver em uma transação quando entrar