我在Spring Boot with PostgreSQL上有一个应用程序。
应用程序对数据库中的行执行更新。在过去,SELECT FOR UPDATE SKIP LOCKED
获取新数据并在一个线程中进行更新,这是为了防止多个节点更新同一行(从而加快文档的更新过程)。
现在为了加快处理速度,select rows
和执行requests
更新(到外部服务)是在单独的threads
(多个具有RestTemplate的工作人员以平滑I / O等待时间)通过准备更新填充此队列,另一个线程工作者通过从队列中选择并插入数据库来执行后处理。所以现在select
和update
处于不同的流程中,并且可以在不同的交易中使用。
当处理分离到不同的线程以防止不同的节点更新相同的行时,保存SELECT FOR UPDATE SKIP LOCKED
行为的好方法是什么?
我考虑向update-status
update-started
node
添加几个字段,并选择WHERE STATUS != 'IN PROGRESS'
,并防止在应用崩溃时保留行,添加{{1} }}。
第二种方式将文件池中的连接发送到另一个进程,也许这是更好的解决方案。据我所知,我也可以选择哪个节点获取锁定,这样也有利于监控。