什么时候需要在try catch块中检查@@ trancount> 0?

ca9*_*3d9 20 t-sql sql-server transactions try-catch sql-server-2008

有时我看到以下代码片段.什么时候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
Run Code Online (Sandbox Code Playgroud)

8kb*_*8kb 8

我可以想到在处理时要考虑的几个场景@@trancount:

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

我相信Remus Rusanu的异常处理和嵌套事务处理所有这些可能性.

  • 所以?那么检查@@ trancount与否? (2认同)