SAVE TRANSACTION vs BEGIN TRANSACTION (SQL Server) how to nest transactions nicely

前端 未结 3 1547
生来不讨喜
生来不讨喜 2020-12-24 14:10

I have a stored procedure that needs to set a save point so that it can, under certain circumstances, undo everything it did and return an error code to the caller, or accep

3条回答
  •  盖世英雄少女心
    2020-12-24 15:00

    I have used this type of transaction manager in my Stored Procedures :

        CREATE PROCEDURE Ardi_Sample_Test  
            @InputCandidateID INT  
        AS  
            DECLARE @TranCounter INT;  
            SET @TranCounter = @@TRANCOUNT;  
            IF @TranCounter > 0  
                SAVE TRANSACTION ProcedureSave;  
            ELSE  
                BEGIN TRANSACTION;  
            BEGIN TRY  
    
                /*
                
                */
    
                IF @TranCounter = 0  
                    COMMIT TRANSACTION;  
            END TRY  
            BEGIN CATCH  
                IF @TranCounter = 0  
                    ROLLBACK TRANSACTION;  
                ELSE  
                    IF XACT_STATE() <> -1  
                        ROLLBACK TRANSACTION ProcedureSave;  
    
                DECLARE @ErrorMessage NVARCHAR(4000);  
                DECLARE @ErrorSeverity INT;  
                DECLARE @ErrorState INT;  
                SELECT @ErrorMessage = ERROR_MESSAGE();  
                SELECT @ErrorSeverity = ERROR_SEVERITY();  
                SELECT @ErrorState = ERROR_STATE();  
    
                RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);  
            END CATCH  
        GO  
    

提交回复
热议问题