2012-03-24 169 views
3

我听说过许多应用程序开发人员在数据库处理竞争条件方面有点麻烦。一个典型的例子是这样的:数据库竞争条件

  • 用户1选择了在一个场,也就是说,numStock,其是3
  • 用户2也选择numStock,这仍然是3
  • 用户1递减numStock(应用程序),并将其设置为2在数据库中。
  • 用户2还减少numStock(在应用程序中),并将其设置为2在数据库中。

在这个例子中,numStock字段应该已经变为1,但是由于用户之间的竞争而被设置为2。

所以当然可以使用锁,但我想过处理这种问题的另一种方式 - 将所有行的详细信息作为WHERE条件传递。让我来解释......

在上面的例子中,SQL代码可能是这样的:

//选择

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 

因此,查询检查数据是否因为它SELECT-ED的数据而改变。 所以我的问题是:(1)这[总是]工作?和(2)与数据库锁定机制(例如,MySQL事务)相比,这是更好的选择吗?

谢谢你的时间。

回答

5

该策略适用并称为“乐观锁定”。那是因为你做了你的处理,假设它会成功,只有在最后才会检查它是否成功。

当然,您需要一种重试交易的方式。如果失败的几率很高,可能会变得效率低下。但在大多数情况下,它工作得很好。

+1

只有单个数据库连接时会发生数据库争用情况吗? – arrowd 2015-03-02 06:39:02

+1

某些数据库包含运行异步进程的选项,您甚至可以通过单个连接获得竞争条件。当然,根据你的观点,这些过程可能被视为单独的连接。 ... – 2015-03-02 06:42:40