Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在事务上设置挂起的回滚?_C#_Mysql_Sql_Transactions_Commit - Fatal编程技术网

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

C# 如何在事务上设置挂起的回滚?,c#,mysql,sql,transactions,commit,C#,Mysql,Sql,Transactions,Commit,我一直在使用MySQL事务来封装在整个方法中执行的几个读/写操作 private void ReceiveOrderConfirm(object sender) { Db.BeginTransaction(); //succeeds Thing1(); //canceled by user Thing2(); //succeeds Thing3(); Db.CommitTransaction(); } 这是我的示例情况,为了

我一直在使用MySQL事务来封装在整个方法中执行的几个读/写操作

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

    //canceled by user 
    Thing2();

    //succeeds
    Thing3();
    Db.CommitTransaction();
}
这是我的示例情况,为了清晰起见简化了

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


我的问题是,有没有一种方法可以设置一个条件,当在这三种方法的末尾尝试提交时,该条件将自动失败。因此,它们都会一起回滚,而不是简单的上半部分。

您可以让
Thing2
返回一个bool来获得成功:

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

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