事务的Rollback()方法有可能抛出异常吗?

3

与EF Core管理事务相关的问题:

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;
    }

注意:在这种特定情况下,不可能将事务嵌入到using语句中,因此在实际代码中需要手动调用.Rollback()


2
当然,回滚操作可能会失败。例如,如果在回滚事务时 SqlConnection 断开,那么会抛出异常。更多信息请参见:https://msdn.microsoft.com/zh-cn/library/zayx5s0h(v=vs.110).aspx - Alberto Solano
2
既然你在谈论一个接口,答案是:它取决于实际的实现。但一般来说:是的,它可能会抛出异常,例如SqlTransaction.Rollback()将在事务已经提交或已经回滚时抛出InvalidOperationException(请参见MSDN上的以下链接:https://msdn.microsoft.com/en-us/library/zayx5s0h(v=vs.110).aspx) - bassfader
1个回答

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. 捕获和处理错误,并在错误处理中指定回滚


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接