sql try/catch rollback/commit - preventing erroneous commit after rollback

后端 未结 5 672
渐次进展
渐次进展 2020-12-12 21:41

I am trying to write an MS sql script that has a transaction and a try/catch block. If it catches an exception, the transaction is rolled back. If not, the transaction is

5条回答
  •  渐次进展
    2020-12-12 22:22

    I used below ms sql script pattern several times successfully which uses Try-Catch,Commit Transaction- Rollback Transaction,Error Tracking.

    Your TRY block will be as follows

     BEGIN TRY
     BEGIN TRANSACTION T
     ----
     //your script block
     ----
     COMMIT TRANSACTION T 
     END TRY
    

    Your CATCH block will be as follows

    BEGIN CATCH
    DECLARE @ErrMsg NVarChar(4000), 
            @ErrNum Int, 
            @ErrSeverity Int, 
            @ErrState Int, 
            @ErrLine Int, 
            @ErrProc NVarChar(200)
     SELECT @ErrNum = Error_Number(), 
           @ErrSeverity = Error_Severity(), 
           @ErrState = Error_State(), 
           @ErrLine = Error_Line(), 
           @ErrProc = IsNull(Error_Procedure(), '-')
     SET @ErrMsg = N'ErrLine: ' + rtrim(@ErrLine) + ', proc: ' + RTRIM(@ErrProc) + ', 
           Message: '+ Error_Message()
    

    Your ROLLBACK script will be part of CATCH block as follows

    IF (@@TRANCOUNT) > 0 
    BEGIN
    PRINT 'ROLLBACK: ' + SUBSTRING(@ErrMsg,1,4000)
    ROLLBACK TRANSACTION T
    END
    ELSE
    BEGIN
    PRINT SUBSTRING(@ErrMsg,1,4000);   
    END
    
    END CATCH
    

    Above different script blocks you need to use as one block. If any error happens in the TRY block it will go the the CATCH block. There it is setting various details about the error number,error severity,error line ..etc. At last all these details will get append to @ErrMsg parameter. Then it will check for the count of transaction (@@TRANCOUNT >0) , ie if anything is there in the transaction for rollback. If it is there then show the error message and ROLLBACK TRANSACTION. Otherwise simply print the error message.

    We have kept our COMMIT TRANSACTION T script towards the last line of TRY block in order to make sure that it should commit the transaction(final change in the database) only after all the code in the TRY block has run successfully.

提交回复
热议问题