我一直在使用MySQL Transactions来封装在我的方法中执行的几个读/写。
private void ReceiveOrderConfirm(object sender)
{
Db.BeginTransaction();
//succeeds
Thing1();
//canceled by user
Thing2();
//succeeds
Thing3();
Db.CommitTransaction();
}
所以这是我的示例情况,为了清晰起见,简化了。
我有一个方法可以在其中执行几个操作,偶尔将控制权传递给其他方法来执行和返回。在这个例子中,所有这三种方法都没有错误。但是用户可以选择按Thing2()中的“取消”按钮。现在,如果我只是在用户按下取消时简单地在我的事务上调用Rollback,那么Thing3将执行并成功,自动包装在它自己的自动提交的新trasnaction中。
我的问题是,有没有办法设置一个条件,当在所有这三种方法结束时尝试提交时,该条件将自动失败。这样他们就可以一起回滚,而不仅仅是上半场。
答案 0 :(得分:1)
你可以让Thing2
返回bool取得成功:
if (Thing2())
{
//
// success, continue
//
Thing3();
Db.CommitTransaction();
}
else
{
//
// cancelled, rollback
//
Db.RollbackTransaction();
}