mysql - 防止 2 个用户同时更新同一条记录

标签 mysql database concurrency

我有一个表 tbl_orders。它有一个数量字段quantity。 在我的应用程序的某些部分,我需要将数量减 1。

我已经知道记录的 id(可从客户端获得),所以我发出一条更新语句:

UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6 

问题是这个查询可能意外地同时运行多次。 例如,2个客服人员可能同时更新同一条记录。 这意味着应该只减少一次的数量将减少 2。

我尝试将更新放入事务中,但这只会导致第二个事务延迟到第一个事务提交。提交后,第二次更新运行并再次递减记录。

如果一个正在修改记录,我如何确保其他查询失败?

更新:

要使更新有效,客户端的数量与数据库中的数量相同。例如,如果用户在他的浏览器上看到一个数量 5 并想要减少它,则数据库中的值必须相同。

更新 2

我找到了一个很好的解释here使用 Doctrine 2 进行乐观锁定:

最佳答案

我过去使用/看到的一种方法是使用时间戳列。查询时,请确保您在编辑记录开始时同时拥有 ID 和原始时间戳。然后,当您尝试更新时,通过

发送
update YourTable
   set counter = counter -1,
       TheTimestampColumn = new timestamp value
   where ID = yourID
     and TheTimeStampColumn = timeStampEditStartedWith

这样,谁先到达原始起始时间戳,谁就赢了。对于下一个,您必须跟踪更新了多少条记录,如果该计数为零,则您将通知用户另一个人在您查看记录时对记录进行了更改。是否要重新加载最新数据? (或类似的东西)。

关于mysql - 防止 2 个用户同时更新同一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13635369/

相关文章:

asp.net - 简单排序的问题。我应该修复数据库还是代码?

mysql - 数据库内部 : How are variable size fields handled?

java - 具有许多线程的 CyclicBarrier 性能较差 : Would a tree-like synchronization structure be an alternative?

python - mysql 6.3/python 3.5 中的 CREATE TABLE 语法错误

mysql - Union All Query 耗时太长

mysql - sql building的进出记录

java - 我的 java 应用程序不会显示 mysql 数据库的任何输出

java - 什么时候调用 java 的 thread.run() 而不是 thread.start()?

sql-server - 如何防止 Sql Server 作业同时运行

java - hibernate 可滚动结果立即获取mysql中的所有行