首页 > 解决方案 > 在进行长期插入事务时无法执行选择查询

问题描述

我对 PostgreSQL 很陌生,我确定我在这里遗漏了一些东西。该场景是版本 11,使用 nodejs 驱动程序在给定表上执行一个大的删除表和插入事务,这可能需要 30 分钟。这样做时,如果我尝试使用 jdbc 驱动程序在该表上使用 select 进行查询,则查询执行将等待事务完成。如果我关闭事务(通过完成它或强制它退出),jdbc 查询就会响应。

我以为我可以在与另一个连接执行事务时读取具有一个连接的表。我在这里想念什么?我应该保留表格(在交易开始时不删除它)吗?

标签: postgresql

解决方案


DROP TABLE对 table进行ACCESS EXCLUSIVE锁定,这正是为了防止它与 table 上的任何其他操作同时发生。毕竟,DROP TABLE物理删除表。

由于所有的锁都被持有直到数据库事务结束,所有对被删除表的访问都被阻塞,直到事务结束。

当然这些文件只有在事务提交时才会被删除,所以你可能想知道为什么 PostgreSQL 不允许同时读取并发事务。但这意味着它COMMIT可能会被并发阅读器阻塞,或者SELECT可能会在阅读过程中导致系统错误,这两种情况听起来都不吸引人。


推荐阅读