2010-05-13 82 views
2

查看文檔說,當事務處於未處理狀態時(在開始事務之後和提交事務之前),Rollback方法可能會拋出。DBTransaction回滾拋出

我似乎無法找到一種方法來檢查事務是否可以回滾或不。也沒有國家財產。

回答

5

理想情況下,只需用「using」語句包裝事務或使用TransactionScope對象,如果拋出異常或事務在超出範圍之前未提交,它將自動回滾。

剩下的時間,就像它醜陋一樣,我通常會將我的回滾包裝在一個空的try/catch塊中,因爲它幾乎總是在具有更有意義的異常的catch處理程序中。我們的想法是,如果可以的話,我們只想回滾,但如果我們不能(因爲任何數量不可預知的原因)不能開始拋出新的異常,因爲只要未提交就會回滾事務無論如何。您仍然需要嘗試正確清理,因此不需要等待垃圾收集器,但如果不能,則回滾並不是真正的問題。

try 
{ 
    SqlTransaction trans = connection.BeginTransaction(); 
    ///blah blah blah 
} 
catch(Exception theExceptionICareAbout) 
{ 
    try 
    { 
    if(trans != null) 
    { 
     trans.Rollback(); 
    } 
    } 
    catch {} 
    throw; //re-throws the meaningful exception. 
} 

注意:不要明確地重新拋出異常(即「拋theExceptionICareAbout」),因爲這將重新創建堆棧跟蹤。相反,只需使用「throw」將繼續現有的異常堆棧。

+0

謝謝,那是我的最後一個策略。我正在尋找更清潔的東西,但我想api中沒有任何東西。 – pdiddy 2010-05-13 13:17:06

+0

是的,那裏可能會有一個檢查組合,你可以執行它會告訴你一個事務是否可以回滾,但是在一天結束時它可能會失敗,所以真正重要的部分是使確保它不會破壞你的異常堆棧。通常我不喜歡依賴例外,但在這種情況下你可以做的事情並不多,而且無論如何你幾乎總是處於特殊情況。 – 2010-05-13 13:19:30

0

您是否在您的C#代碼中使用了TransactionScope對象。如果是這樣,你永遠不需要發出回滾。如果您沒有顯式提交事務,則在事務作用域對象超出作用域時它將回滾。

+0

是的,我們正在使用transactionscope。我們正在使用DbTransaction對象。 – pdiddy 2010-05-13 13:28:15