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

wr98u20j  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(342)

我正在处理一个并发情况下的应用程序,其中应用程序的多个示例同时更新数据库中的行。每个应用程序示例在更新事件表中创建一个更新事件,更新事件的状态可以是“进行中”/“新建”/“取消”。我想创建一个查询来更新更新事件,如果:
在状态为“进行中”的同一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

更新不是很频繁,而且延迟不是问题。有关于如何构建查询的IDE吗?它是线程安全的吗?

rhfm7lfc

rhfm7lfc1#

主要的问题是,在这个过程中,您有多频繁的使用以及什么样的性能要求。有捷径,也有很长的路。
很长的路将需要您使用一个有序/单线程处理器来接收请求并对它们进行排队。使用流处理器和其他方法来控制这些请求。如果在一个节目时间内有大量的更新,使用流处理器可以很好地扩展。
对于较小的应用程序,可以检查并发隔离级别。并发性使用一些锁定机制来确保第一个启动事务的示例将完成事务,并且只有在另一个示例也能够完成更改之后。
两者都不是快速的解决方案,需要你读一点关于它们的知识。如何在sgbd、应用程序代码等中设置隔离级别。

相关问题