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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top