2012-12-21 63 views
17

有時我看到下面的代碼片段。 begin try需要if @@trancount > 0何時需要?兩個都?或者它是一種安全的方式(最佳實踐),以便在檢查之前一直檢查它是否回滾?當需要在try catch塊中檢查@@ trancount> 0時?

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 

回答

8

我能想到的一些場景@@trancount打交道時要考慮:

  1. 當前事務已從中有 自己的事務
  2. 當前的事務被稱爲另一個存儲過程調用用自己的 交易一些.NET代碼
  3. 目前的交易是唯一的交易

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

+0

該示例似乎嘗試避免嵌套事務。有必要嗎? – ca9163d9

+0

對我來說,這個想法是,如果這個新的動作是一個嵌套事務,然後將其保存。如果有錯誤,如果這是一個嵌套事務,只回滾嵌套事務,以免影響原主叫方。 – 8kb

+0

4:當你調用一些垃圾加密API SP如果決定有問題,不回滾自己的事務...... –