2017-03-07 125 views
0

我想知道是否有办法部分提交事务。我在C#中有一个长时间运行的事务,并且当两个用户并行运行这个事务时,这些数据是相互依赖的,即使在事务中也应该显示给他们。例如说我有这3列的表格部分提交MySQL事务?

用户名| left_child | right_child

我正在制作一棵二叉树,每当一个新用户被添加到数据库中时,它们就会到达树中的某个地方。但是我在一个事务中运行了所有的插入和更新操作,所以如果有一个错误,整个事务可以被回滚,树的结构也不会受到干扰。但问题是两个用户同时使用我的Web应用程序的时间。 说用户名'jackie_'在一分钟内没有任何孩子。两个新用户'king_'和'robbo'彼此并行进行,并且两个用户正在进行交易。由于为一个用户运行的事务的结果在实际数据库中对其他用户不可见,所以他们都认为'jackie_'的left_child尚未设置,因此他们都将left_child更新为他们自己的用户名。在交易过程中,因为更新对他们都是成功的,他们都提交交易。现在我有两个用户,但其中只有一个用户实际上已成功进入树中,并且树的结构完全受到干扰。

所以我需要的是即使在“部分”期间也能够提交一个事务。因此,如果'robbo'首先设置了'jackie_'的left_child,则事务将更改实现到数据库中,所以当'king_'尝试更新同一行时,他不能。但是,如果一路上,如果'robbo'出现其他问题,我仍然希望能够回滚整个交易。任何其他更实用的解决方案也会受到赞赏。

对于我运行的所有查询,这是我做的交易方式

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

其中sqlTrans是我使用的所有MySqlCommand对象的交易执行它们

+1

不,你不能这样做。你必须找出解决这个问题的另一种方法。 –

回答

1

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

+0

我最终将事务拆分为多个较小的事务,它确实解决了我的问题。它只是减少了冲突的可能性,但是当树变大并且更加扩展并且发现叶节点在每个事务中需要越来越多的时间时,由于它必须是完整的树,未来仍然有可能发生冲突。但是,它仍然解决了当前的问题,我可以做出更多的调整,以进一步减少冲突的可能性,所以谢谢。 –