我听说很多应用程序开发人员在处理数据库时遇到了一些竞态条件的问题。一个典型的例子可能是这样的:
- 用户1选择一个字段,比如numStock,它的值是3
- 用户2也选中numStock,此时它仍然是3
- 用户1减少numStock(在应用程序中),并将其在数据库中设置为2。
- 用户2也减少numStock(在应用程序中),并将其在数据库中设置为2。
在这个例子中,numStock字段应该变成1,但由于用户之间的竞争,它被设置为2。
当然可以使用锁,但我想到了另一种处理方式 - 将所有行细节作为WHERE条件传递。让我解释一下...
在上面的例子中,SQL代码可能如下所示:
//select
SELECT itemID, numStock FROM items WHERE itemID = 45
//更新
UPDATE items SET numStock = 2 WHERE itemID = 45
我解决竞争的想法:
//选择
SELECT itemID, numStock FROM items WHERE itemID = 45
//更新
UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3
因此,该查询检查数据是否自从它选择数据后发生了更改。因此,我的问题是:(1)这种方法[总是]有效吗? (2)与数据库锁定机制(例如,MySQL事务)相比,这是更好的选择吗?谢谢您的时间。
SET numStock = numStock + 1
- raw-bin hood