我们正在开发一个具有“白板”功能的宁静应用程序。我曾在一个问题上提出过相关问题:Is there a concurrency problem here? How to test it during development?
我们首先选择在没有并发的情况下实现核心功能,因为应用程序基本上不熟悉,我们不得不消除实施风险。由于我很清楚并发概念/问题,因此我觉得可以将并发/冲突管理代码延迟到最佳时间。似乎直到现在:)
在白板上,多个团队成员可以创建/读取/更新/删除记录。主要出现的冲突是由于更新和删除(有点陈旧的读取被认为是好的,我们定期更新)
场景:返回的每个记录都有一个id以及MySQL首次创建记录时由NOW()设置的最后一个时间戳。
冲突情景:
select * from ... where...
查询后跟时间戳检查并更新,如果相同的其他'合并'(即,只是附加到当前数据< em> ------- CONFLICT / MERGED ------- as delimiter)这似乎是唯一可以说的冲突场景(任何人都可以发现我可能遗失的任何其他内容吗?)
所以问题是如何实际实现这种并发/冲突检查?该场景需要是原子的,即检查值是否存在/或是否相同然后更新。创建交易的方式是什么?我不确定是否只是通过Spring事务并发出2个查询(一个用于select而另一个用于更新),或者是否有一个SQL语法可以帮助我解决这个原子性要求。
我的问题是“怎么做”?我读过关于SELECT ... FOR ... UPDATE但是不明白它是如何工作的,我也不明白SELECT ... LOCK IN SHARE MODE可以/将解决问题。
任何想法/指针都会非常有用:)使用Restlet / Spring-Jdbc / MySql
答案 0 :(得分:0)
如果我在你的位置,我会联系一个Spring事务管理器(http://static.springsource.org/spring/docs/3.0.x/reference/transaction.html)并注释我的dao或服务层@Transaction的方法。
使用SELECT ... FOR ... UPDATE可以使用,但你必须在非常高度并发的环境中工作才能证明它的合理性