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

Son*_*ngo 1 mysql database concurrency

我有一张桌子tbl_orders.它有一个数量字段quantity.在我的应用程序的某些部分,我需要将数量减少1.

我已经知道了id记录(可以从客户端获得),所以我发布了一个更新声明:

UPDATE tbl_orders
SET quantity=quantity-1
WHERE id= 6 
Run Code Online (Sandbox Code Playgroud)

问题是此查询可能会意外地同时运行多次.例如,2个客户服务运营商可以同时更新同一记录.这意味着当数量应该仅减少一次时,数量将减少2.

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

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

更新:

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

更新2

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

DRa*_*app 5

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

update YourTable
   set counter = counter -1,
       TheTimestampColumn = new timestamp value
   where ID = yourID
     and TheTimeStampColumn = timeStampEditStartedWith
Run Code Online (Sandbox Code Playgroud)

这样,无论谁先用原始的开始时间戳获得它都会获胜.对于下面的一个,您必须跟踪更新的记录数,如果该计数等于零,那么您将通知用户另一个人在您查看记录时对记录进行了更改.您想重新加载最新数据吗?(或类似的东西).