Executar um procedimento armazenado dentro BEGIN / END TRANSACTION
-
05-07-2019 - |
Pergunta
Se eu criar um procedimento armazenado no SQL e chamá-lo (EXEC spStoredProcedure
) dentro do / END BEGIN TRANSACTION, se este outro procedimento armazenado também cair na transação?
Eu não sabia se ele trabalhou como try / capturas em C #.
Solução
Sim, tudo que você faz entre o Begin Transaction e Commit (ou reversão) é parte da transação.
Outras dicas
Parece ótimo, graças um bando. Acabei fazendo algo parecido com isso (porque eu estou no 05)
BEGIN TRY
BEGIN TRANSACTION
DO SOMETHING
COMMIT
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK
-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
@ErrSeverity = ERROR_SEVERITY()
RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH
Eu acredito em MS SQL Server a execução do procedimento armazenado que aconteceria dentro da transação, mas ter muito cuidado com isso. Se você tiver transações aninhadas (ou seja, fora de transação do procedimento armazenado e uma transação diferente dentro do procedimento armazenado), um rollback irá afectar todas as transações, e não apenas a transação envolvente mais próxima.
Como Chris mencionado, você deve ser cuidadoso sobre rolando costas transação.
Especificamente o seguinte:
IF @@TRANCOUNT > 0 ROLLBACK
nem sempre é o que você quer. Você poderia fazer algo assim
IF(@@TRANCOUNT = 1) ROLLBACK TRAN
ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
RETURN @error
Desta forma, o proc chamando pode inspecionar o valor de retorno do procedimento armazenado e determinar se ele quer cometer qualquer maneira ou continuar a borbulhar o erro.
A razão é que 'COMMIT' só vai diminuir o seu contador de transação. Uma vez que diminui o contador de transações para zero, em seguida, um real cometer irá ocorrer.
Como Chris e James mencionado, você precisa ter cuidado ao lidar com transações aninhadas. Há um conjunto muito bons artigos sobre o assunto das transações escritos por Don Peterson em SQL Server Centra l, eu recomendaria ter uma leitura daqueles:
Aqui há:
Sim, todas as chamadas de procedimento armazenados aninhados estão incluídos no escopo da transação. Se você estiver usando SQL Server 2005 ou superior, você pode usar try ... catch bem. Aqui é mais detalhes sobre isso.
@ Chris, eu não sabia disso.
Quando pesquisando para mais informações, me deparei com este - você pode definir 'pontos de salvamento', que pode ser revertida para sem rolar para trás toda a transação.
Pode ser útil nesta situação.