2

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

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

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

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

我尝试将更新放入事务中,但这只会延迟第二个事务,直到第一个事务被提交。一旦它被提交,第二次更新就会运行并再次减少记录。

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

更新:

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

更新 2

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

4

1 回答 1

7

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

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

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

于 2012-11-29T21:57:13.670 回答