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. 捕获和处理错误,并且错误处理