【问题标题】:When it's necessary to check @@trancount > 0 in try catch block?何时需要在 try catch 块中检查 @@trancount > 0?
【发布时间】:2012-12-21 02:23:11
【问题描述】:

有时我看到下面的代码sn-p。 if @@trancount > 0 什么时候需要 begin try?两个都?或者它是一种安全的方式(最佳实践)来检查它,以防它在检查之前回滚?

begin tran
begin try
  ... just several lines of sql ...
  if @@trancount > 0 commit tran
end try
begin catch
  if @@trancount > 0 rollback tran
end catch

【问题讨论】:

    标签: sql-server sql-server-2008 tsql transactions try-catch


    【解决方案1】:

    在处理@@trancount时,我能想到几个需要考虑的场景:

    1. 当前事务是从另一个存储过程调用的,该存储过程具有 自己的交易
    2. 当前事务由一些 .NET 代码调用 交易
    3. 当前事务是唯一的事务

    我相信 Remus Rusanu 的 Exception handling and nested transactions 可以处理所有这些可能性。

    【讨论】:

    • 该示例似乎试图避免嵌套事务。有必要吗?
    • 对我来说,这个想法是如果这个新动作是一个嵌套事务,那么保存它。如果有错误,如果这是一个嵌套事务,只回滚嵌套事务,以免影响原来的调用者。
    • 4:当你调用一些垃圾加密 API SP 时,如果它认为有问题,它不会回滚自己的事务......
    • 所以?那么检查@@trancount 与否?
    • 我会说这个被接受的“答案”绝对不能回答这个问题。
    【解决方案2】:

    当你不使用@@trancount时,嵌套事务存储过程的错误信息不会返回错误的确切原因只是reurtn“回滚事务请求没有相应的开始事务”,否则它给出了错误的确切原因,因此使用正确的语法很容易处理错误。

    【讨论】:

      【解决方案3】:

      回答这个问题 - 执行@@trancount 的时间是中间的代码是否可能已经执行了您启动的事务的提交或回滚。因此,例如,如果您正在调用存储过程 - 然后在最后执行检查。

      顺便说一句,而不是做一个 if @@trancount>0 我建议最好在代码块的开头检查 @@trancount,然后看看计数是否在最后增加了,其中case 执行提交或回滚,具体取决于 try/catch。

      特别是如果您在触发器中,因为 @@trancount 将始终为 1,因此仅执行 @@trancount>0 可能会导致错误。

      但是即使您的代码只是在一个存储过程中,假设它被另一个本身具有打开事务的过程调用,如果您的代码错误并回滚,那么外部存储过程也将回滚其事务(见https://www.sqlskills.com/blogs/paul/a-sql-server-dba-myth-a-day-2630-nested-transactions-are-real/)。

      所以

      开始传输 打印@@TRANCOUNT

      开始传输 打印@@TRANCOUNT

      回滚传输 打印@@TRANCOUNT

      显示 1 2 0

      所以基本上 - 如果中间的代码正在调用其他程序,则需要执行 IF @@TRANCOUNT 检查。

      【讨论】:

        【解决方案4】:

        检查的原因是如果您在 @@trancount=0 时提交 trans 或回滚它,您会收到带有以下错误消息的异常: COMMIT TRANSACTION 请求没有对应的 BEGIN TRANSACTION。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-01
          • 1970-01-01
          • 2015-04-28
          • 1970-01-01
          • 1970-01-01
          • 2020-12-30
          相关资源
          最近更新 更多