在BEGIN / END TRANSACTION中执行存储过程

时间:2008-10-07 19:50:58

标签: sql sql-server stored-procedures rollback sqltransaction

如果我在SQL中创建一个存储过程并在BEGIN / END TRANSACTION中调用它(EXEC spStoredProcedure),那么这个其他存储过程是否也属于该事务?

我不知道它是否像C#中的try / catches一样工作。

7 个答案:

答案 0 :(得分:39)

是的,在Begin Transaction和Commit(或Rollback)之间执行的所有是事务的一部分。

答案 1 :(得分:12)

听起来很棒,多亏了一堆。我最终做了这样的事情(因为我在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

答案 2 :(得分:5)

我相信在MS SQL Server中,存储过程执行会在事务中发生,但要非常小心。如果您有嵌套事务(即存储过程之外的事务和存储过程中的不同事务),则回滚将影响所有事务,而不仅仅是最近的封闭事务。

答案 3 :(得分:5)

正如克里斯所说,你应该小心滚动交易。

特别是:

IF @@TRANCOUNT > 0 ROLLBACK

并不总是你想要的。你可以做这样的事情

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

这样,调用proc可以检查存储过程的返回值,并确定是否要提交或继续冒出错误。

原因是'COMMIT'只会递减您的交易柜台。一旦将事务计数器减少到零,就会发生实际提交。

答案 4 :(得分:2)

提到ChrisJames时,在处理嵌套事务时需要小心。 关于Don PetersonSQL Server Centra l上撰写的交易主题有一套非常好的文章,我建议读一读:

这里有:

答案 5 :(得分:1)

是的,所有嵌套存储过程调用都包含在事务范围内。如果您使用的是SQL Server 2005或更高版本,则也可以使用Try ... Catch。 Here更详细。

答案 6 :(得分:1)

@Chris,我不知道。

当谷歌搜索更多信息时,我遇到this - 你可以设置'保存点',可以回滚到它而不回滚整个交易。

在这种情况下可能有用。