Executing a stored procedure inside BEGIN/END TRANSACTION

前端 未结 7 1034
谎友^
谎友^ 2020-12-13 06:28

If I create a Stored Procedure in SQL and call it (EXEC spStoredProcedure) within the BEGIN/END TRANSACTION, does this other stored procedure also fall into the

相关标签:
7条回答
  • 2020-12-13 06:36

    @Chris, I did not know that.

    When googling for more info, I came across this - you can set 'savepoints', which can be rolled back to without rolling back the whole transaction.

    Could be useful in this situation.

    0 讨论(0)
  • 2020-12-13 06:40

    As Chris and James mentioned, you need to be careful when dealing with nested transactions. There is a set a very good articles on the subject of transactions written by Don Peterson on SQL Server Central , I would recommend having a read of those:

    Here there are:

    • part 1
    • part 2
    • part 3
    0 讨论(0)
  • 2020-12-13 06:44

    Sounds great, thanks a bunch. I ended up doing something like this (because I'm on 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
    
    0 讨论(0)
  • 2020-12-13 06:46

    As Chris mentioned, you should be careful about rolling the transaction back.

    Specifically this:

    IF @@TRANCOUNT > 0 ROLLBACK
    

    is not always what you want. You could do something like this

    IF(@@TRANCOUNT = 1) ROLLBACK TRAN
    ELSE IF(@@TRANCOUNT > 1) COMMIT TRAN
    RETURN @error
    

    This way, the calling proc can inspect the return value from the stored procedure and determine if it wants to commit anyways or continue to bubble up the error.

    The reason is that 'COMMIT' will just decrement your transaction counter. Once it decrements the transaction counter to zero, then an actual commit will occur.

    0 讨论(0)
  • 2020-12-13 06:51

    Yes, all nested stored procedure calls are included in the scope of the transaction. If you are using SQL Server 2005 or greater, you can use Try...Catch as well. Here is more detail on that.

    0 讨论(0)
  • 2020-12-13 06:53

    Yes, everything that you do between the Begin Transaction and Commit (or Rollback) is part of the transaction.

    0 讨论(0)
提交回复
热议问题