如何在事务上设置挂起的回滚?

Posted

技术标签:

【中文标题】如何在事务上设置挂起的回滚?【英文标题】:How to set a pending Rollback on a Transaction? 【发布时间】:2018-09-07 08:37:32 【问题描述】:

我一直在使用 mysql Transactions 来封装在我的方法中执行的几个读/写操作。

private void ReceiveOrderConfirm(object sender)

    Db.BeginTransaction();
    //succeeds
    Thing1();

    //canceled by user 
    Thing2();

    //succeeds
    Thing3();
    Db.CommitTransaction();

这是我的示例情况,为清楚起见进行了简化。

我有一个方法,它在其中做几件事,偶尔将控制权交给其他方法来执行和返回。在此示例中,所有这三种方法都不会出错。但是用户可以选择在 Thing2() 中按下取消按钮。现在,如果我只是在用户按下取消时对我的事务调用回滚,那么 Thing3 将执行并成功,自动包装在它自己的自动提交的新事务中。

我的问题是,有没有办法设置一个条件,当在所有这三种方法结束时尝试提交时会自动失败。这样他们就一起回滚,而不是简单的上半场。

【问题讨论】:

【参考方案1】:

你可以让Thing2返回一个布尔值来表示成功:

if (Thing2())

    //
    // success, continue
    //
    Thing3();
    Db.CommitTransaction();

else

    //
    // cancelled, rollback
    //
    Db.RollbackTransaction();

【讨论】:

这也是我的想法,但我希望有一个更全面的解决方案,可以附加到取消命令或在更广泛的场景中使用。我必须在整个系统的许多地方都这样做。

以上是关于如何在事务上设置挂起的回滚?的主要内容,如果未能解决你的问题,请参考以下文章

简单事务的回滚

如何创建表的回滚副本以防我插入或更新错误

事务嵌套问题总结-rollback-only异常

spring 声明式事务管理在真实的Service和单元测试时的回滚情况,需要注意的问题,jpa为例子

spring中啥样的异常会造成事务回滚?!

Spring事务隔离级别:REQUIRES_NEW使用细节