我有一个表 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/