部分提交MySQL事务?

时间:2017-03-07 18:28:32

标签: mysql transactions

我想知道是否有部分提交交易的方法。我在C#中有一个长时间运行的事务,当两个用户正在相互并行运行此事务时,数据是相互依赖的,即使在事务中也应该向他们显示。例如,假设我有一个包含这3列的表

用户名| left_child | right_child

我正在创建一个二叉树,每当新用户被添加到数据库中时,它们就会在树中的某个地方结束。但是我在一个事务中运行所有插入和更新,因此如果甚至出现一个错误,则可以回滚整个事务并且不会干扰树的结构。但问题是当两个用户同时使用我的网络应用程序时。 说用户名' jackie _'一分钟没有孩子。两个新用户' king _'和#rob;'彼此并行输入,并且两个事务都在运行。由于为一个用户运行的事务的结果对于实际数据库中的另一个用户来说是不可见的,因此他们都认为左边的孩子是' jackie _'还没有设置,所以他们都将left_child更新为自己的用户名。在交易期间,由于两者都更新成功,因此它们都提交了事务。现在我有两个用户,但实际上只有一个用户成功进入树中,树的结构完全受到干扰。

所以我需要的是即使在部分"期间能够提交一个交易。所以,如果' robbo'设置了左边的' jackie _'首先,该事务实现了对数据库的更改,因此当#king;'尝试更新同一行,他不能。但是,如果一路走来,如果发生了其他一些问题,那就是“抢劫”。我仍然希望能够回滚整个事务。任何其他更实用的解决方案也值得赞赏。

对于我正在运行的所有查询,这是我在事务中执行此操作的方式

        string insertTreesQuery = "INSERT INTO tree (username) VALUES('king_')";
        MySqlCommand insertTreesQueryCmd = new MySqlCommand(insertTreesQuery , con);
        insertTreesQueryCmd.Transaction = sqlTrans;
        insertTreesQueryCmd.ExecuteNonQuery();

其中sqlTrans是我在执行所有MySqlCommand个对象时使用的事务

1 个答案:

答案 0 :(得分:2)

你问的是不可能的。您不能“部分”提交交易。我假设您的示例大大简化,因为您提到的事务非常大。在这种情况下,最好将其分成可以独立提交的较小的,从而减少发生冲突的可能性。