我正在处理一个并发情况下的应用程序,其中应用程序的多个示例同时更新数据库中的行。每个应用程序示例在更新事件表中创建一个更新事件,更新事件的状态可以是“进行中”/“新建”/“取消”。我想创建一个查询来更新更新事件,如果:
在状态为“进行中”的同一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吗?它是线程安全的吗?
1条答案
按热度按时间rhfm7lfc1#
主要的问题是,在这个过程中,您有多频繁的使用以及什么样的性能要求。有捷径,也有很长的路。
很长的路将需要您使用一个有序/单线程处理器来接收请求并对它们进行排队。使用流处理器和其他方法来控制这些请求。如果在一个节目时间内有大量的更新,使用流处理器可以很好地扩展。
对于较小的应用程序,可以检查并发隔离级别。并发性使用一些锁定机制来确保第一个启动事务的示例将完成事务,并且只有在另一个示例也能够完成更改之后。
两者都不是快速的解决方案,需要你读一点关于它们的知识。如何在sgbd、应用程序代码等中设置隔离级别。