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

时间:2018-03-28 15:15:36

标签: c# mysql sql transactions commit

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

private void ReceiveOrderConfirm(object sender)
{
    Db.BeginTransaction();
    //succeeds
    Thing1();

    //canceled by user 
    Thing2();

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

所以这是我的示例情况,为了清晰起见,简化了。

我有一个方法可以在其中执行几个操作,偶尔将控制权传递给其他方法来执行和返回。在这个例子中,所有这三种方法都没有错误。但是用户可以选择按Thing2()中的“取消”按钮。现在,如果我只是在用户按下取消时简单地在我的事务上调用Rollback,那么Thing3将执行并成功,自动包装在它自己的自动提交的新trasnaction中。

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

1 个答案:

答案 0 :(得分:1)

你可以让Thing2返回bool取得成功:

if (Thing2())
{
    //
    // success, continue
    //
    Thing3();
    Db.CommitTransaction();
}
else
{
    //
    // cancelled, rollback
    //
    Db.RollbackTransaction();
}