1

與EF核心管理交易相關的問題:事務Rollback()是否有機會拋出異常?

IDbContextTransaction.Rollback()是否有機會返回異常,以便將它置於try塊內有意義?

try 
    { 
     //... 
     if(condition) 
      transaction.Commit(); 
     else 
      throw methodReturn.Exception; 
    } 
    catch (Exception e) 
    { 
     try  // Does this try make any sense? 
     { 
      transaction.Rollback(); 
     } 
     catch 
     { 
      // Log 
     } 
     throw e; 
    } 

PD:在這種特定情況下是不可能嵌入交易成using語句,所以手動.Rollback()呼叫會在實際的代碼需要。

+1

當然回滾可能會失敗中指定回滾。例如,如果SqlConnection在回滾事務時中斷,則會引發異常。更多信息:https://msdn.microsoft.com/en-us/library/zayx5s0h(v=vs.110).aspx –

+1

由於你在談論一個接口,答案是:它取決於實際的實現。但總的來說:是的,它可能會拋出一個異常,例如當事務已經被提交或者已經被回滾時,'SqlTransaction.Rollback()'會拋出一個'InvalidOperationException'(參見MSDN上的以下鏈接:https:// msdn .microsoft.com/en-us/library/zayx5s0h(v = vs.110).aspx) – bassfader

回答

0

大部分的時候是不是直到:

  1. 死鎖檢測
  2. 沒有互聯網連接
  3. 邏輯上和物理一致的連接
  4. 關機,斷電,意外終止

要解決這些情況,您可以:

  1. 使用Xact_Abort設置。當SET XACT_ABORT爲ON時,如果Transact-SQL語句引發運行時錯誤,則整個事務將終止並回滾。 當SET XACT_ABORT爲OFF時,在某些情況下,只有導致錯誤的Transact-SQL語句回滾並且事務繼續處理。根據錯誤的嚴重程度,即使SET XACT_ABORT爲OFF,整個事務也可能會回滾。 OFF是默認設置。

  2. 捕獲和處理錯誤,並且錯誤處理