当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《在BEGIN/ENDTRANSACTION中执行存储过程》经验,为你挑选了4个好方法。

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

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



1> Blorgbeard..:

是的,您在Begin Transaction和Commit(或Rollback)之间执行的所有操作都是事务的一部分.


是的,这就是嵌套事务的工作方式.提交内部事务[什么都不做](http://stackoverflow.com/questions/851441/nested-transactions-in-sql-server); 实际上只有外部事务被提交或回滚.
这不完全正确.实际上,对表变量的操作在事务范围之外; 回滚不会影响表变量中所做的任何更改.
好吧,我的意思是你对数据库所做的一切* - 我想我认为很明显变量不会受到事务的影响 - 尽管我认为表变量比标量变量更不直观.

2> Miles..:

听起来很棒,谢谢你们.我最终做了这样的事(因为我在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



3> Chris Shaffe..:

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



4> James..:

正如克里斯提到的,你应该小心滚动交易.

特别是这个:

IF @@TRANCOUNT > 0 ROLLBACK

并不总是你想要的.你可以这样做

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

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

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

推荐阅读
夏晶阳--艺术
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有