为什么Postgres在插入另一个表时会锁定一个表

时间:2019-09-11 10:44:23

标签: database postgresql

我的名为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));

这些表之间没有任何外部约束。而且我们确实具有索引,因此我们可以在处理过程中运行查询以进行处理。

为什么一个完全不同的表可以阻止其他表?而我们该如何解决呢?

1 个答案:

答案 0 :(得分:2)

您的查询具有误导性。

它显示为“阻塞查询”,实际上是阻塞事务中运行的最后一条语句。

可能是同一事务中的先前语句导致entity(或其中的一行)被锁定。