数据库竞争条件

Mat*_*sen 5 database race-condition

我听说很多应用程序开发人员在数据库处理的竞争条件方面遇到了一些麻烦.一个典型的例子是这样的:

  • 用户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
Run Code Online (Sandbox Code Playgroud)

//更新

UPDATE items SET numStock = 2 WHERE itemID = 45
Run Code Online (Sandbox Code Playgroud)

我想解决这个问题的想法:

//选择

SELECT itemID, numStock FROM items WHERE itemID = 45
Run Code Online (Sandbox Code Playgroud)

//更新

UPDATE items SET numStock = 2 WHERE itemID = 45 AND numStock = 3
Run Code Online (Sandbox Code Playgroud)

因此,查询检查数据是否因为选择了数据而发生了变化.所以我的问题是:(1)这[总是]会起作用吗?(2)与数据库锁定机制(例如,MySQL事务)相比,这是一个更好的选择吗?

谢谢你的时间.

Jen*_*der 7

这种策略起作用,称为"乐观锁定".那是因为你做了你的处理,假设它会成功,并且只在最后实际检查它是否成功.

当然,您需要一种方法来重试事务.如果失败的可能性非常高,可能会变得低效.但在大多数情况下,它的工作正常.

  • 当有单个数据库连接时会发生数据库竞争条件吗? (2认同)
  • 某些数据库包含运行异步进程的选项,利用这些功能,您甚至可以通过单个连接获取竞争条件。当然,根据您的观点,这些过程可能会被视为单独的连接。... (2认同)