SQL:在并发情况下,如果满足其他行上的条件,则更新行

时间:2018-05-28 17:42:31

标签: mysql concurrency database-administration

我正在同时处理应用程序中的应用程序,其中应用程序的多个实例同时更新数据库中的行。 每个应用程序实例在更新事件表中创建更新事件,更新事件的状态可以是IN_PROGRESS / NEW / CANCELED。 我想在以下情况下创建一个更新更新事件的查询:

  • 在状态= IN_PROGRESS
  • 的同一itemId上没有更新事件
  • 同一itemId上没有更新事件,状态= NEW,时间戳>当前更新事件时间戳。

表:

UpdateId | itemId | status      | time_stamp
1        | 1      | IN_PROGRESS | 1.1
2        | 1      | NEW         | 1.2
3        | 1      | NEW         | 1.3
4        | 1      | NEW         | 1.4

如上所述的更新1,2,3,4基本上我希望2等到1完成,如果3,4则接着2 - >取消。 3相同。

类似的东西:

Update UPDATE_EVENT SET status = IN_PROGRESS IF {
SELECT count (*) FROM UPDATE_EVENT where status=IN_PROGRESS & itemId=item1 = 0
  && 
 SELECT count (*) FROM UPDATE_EVENT where status=NEW & timestamp > updateId_abc123.timestamp = 0
} WHERE updateId=abc123

更新不是很频繁,延迟也不是问题。 关于如何构建查询的任何想法,它是否是线程安全的?

1 个答案:

答案 0 :(得分:1)

主要问题是您对此过程的频率和性能要求。有一条捷径,也有很长的路要走。

很长的路要求你使用一个有序/单线程处理器来接收请求并排队。使用流处理器和其他想法来控制这些请求。如果在展示时间内有大量更新,使用流处理器可以很好地扩展。

对于较小的应用程序,可以检查并发隔离级别。并发使用一些锁定机制来确保第一个启动事务将完成它,并且只有在其他实例能够进行更改之后。

两者都不是快速解决方案,需要您仔细阅读它们。如何在SGBD,应用程序代码等中设置隔离级别