我的名为Event的源表位于另一个数据库中,它具有数百万行。每个事件可以具有DELETE,UPDATE或NEW动作。
我们有一个Java流程,按照这些事件的创建顺序进行处理,并执行各种规则,然后将结果插入多个表中以进行查找,分析等。
我现在正在使用JdbcTemplate并使用batchUpdate来按顺序删除和向上插入Postgres DB,但是我也希望能够并行。每批有1,000个要插入/插入或删除的实体。
但是,目前,即使是按顺序执行,Postgres也以某种方式锁定查询,而我对此并不十分了解,为什么也不知道。
其中一些代码
0,1,2,3
每个服务都在不同的表中进行插入/删除操作。他们只是一笔交易。
以下查询
entityService.deleteBatch(deletedEntities);
indexingService.deleteBatch(deletedEntities);
...
entityService.updateBatch(allActiveEntities);
indexingService.updateBatch(....);
返回
SELECT
activity.pid,
activity.usename,
activity.query,
blocking.pid AS blocking_id,
blocking.query AS blocking_query
FROM pg_stat_activity AS activity
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(activity.pid));
这些表之间没有任何外部约束。而且我们确实具有索引,因此我们可以在处理过程中运行查询以进行处理。
为什么一个完全不同的表可以阻止其他表?而我们该如何解决呢?
答案 0 :(得分:2)
您的查询具有误导性。
它显示为“阻塞查询”,实际上是阻塞事务中运行的最后一条语句。
可能是同一事务中的先前语句导致entity
(或其中的一行)被锁定。