Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Dois-je compter les transactions avant de revenir en arrière dans le bloc catch de T-SQL ?

En fait, je ne démarre jamais une nouvelle transaction si j'en suis déjà une.

Cela concerne les procs stockés imbriqués, les TXN distribués et TransactionScope

Rappelez-vous, il y a il n'y a rien de tel qu'une transaction imbriquée dans SQL Server De toute façon.

DECLARE @StartTranCount int

BEGIN TRY
    SET @StartTranCount = @@TRANCOUNT
    IF @StartTranCount = 0 BEGIN TRAN
        -- my code
    IF @StartTranCount = 0 COMMIT TRAN
END TRY
BEGIN CATCH
    IF @StartTranCount = 0 AND @@trancount > 0
    BEGIN
        ROLLBACK TRAN
        DECLARE @message NVARCHAR(MAX)
        DECLARE @state INT
        SELECT @message = ERROR_MESSAGE(), @state = ERROR_STATE()
        RAISERROR (@message, 11, @state)
    END
    /*
    or just
    IF @StartTranCount = 0 AND @@trancount  
        ROLLBACK TRAN
    */
END CATCH