我正在同时处理应用程序中的应用程序,其中应用程序的多个实例同时更新数据库中的行。 每个应用程序实例在更新事件表中创建更新事件,更新事件的状态可以是IN_PROGRESS / NEW / CANCELED。 我想在以下情况下创建一个更新更新事件的查询:
表:
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
更新不是很频繁,延迟也不是问题。 关于如何构建查询的任何想法,它是否是线程安全的?
答案 0 :(得分:1)
主要问题是您对此过程的频率和性能要求。有一条捷径,也有很长的路要走。
很长的路要求你使用一个有序/单线程处理器来接收请求并排队。使用流处理器和其他想法来控制这些请求。如果在展示时间内有大量更新,使用流处理器可以很好地扩展。
对于较小的应用程序,可以检查并发隔离级别。并发使用一些锁定机制来确保第一个启动事务将完成它,并且只有在其他实例能够进行更改之后。
两者都不是快速解决方案,需要您仔细阅读它们。如何在SGBD,应用程序代码等中设置隔离级别