复制命令阻止 postgres 中的其他会话

copy command blocks other sessions in postgres

我正在使用 copy from 这样的命令将数据从 CSV 文件导入到 Postgres table

copy tbl_name(col1, col2, col3) from '/sample.csv' delimiter ',';

命令在事务(读写)中执行。 执行此命令时,我在新终端中打开了一个新的 SQL 会话,但在这个新会话中,我无法执行 select 命令。它将被卡住,直到事务在第一个会话中提交。 在 python 程序中,我正在使用 Psycopg2copy_expert 命令复制文件时,会发生同样的问题,即使我已经使用池创建了 connection_engine。 是否可以防止 Postgres 在将数据复制到 table 时阻止 er 会话?

这是不可能的,除非您使用 SELECT ... FOR UPDATE,它会尝试在已经被 COPY 锁定的行上放置行锁。

PostgreSQL 的原则是读者不会阻塞写入者,反之亦然。

这不是普遍现象。这里发生的事情比你告诉我们的要多。

也许 COPY 发生在同一个事务中,因为其他事务在正在 SELECTed 的同一个 table 上获得强锁(如 TRUNCATE)。或者你的 SELECT 可能正在调用一些用户定义的函数(可能是直接的,可能是通过触发器或其他东西),它正在获取比 SELECT 通常需要的更强的锁。

在没有那些特殊情况的情况下,我没有问题同时运行COPY和SELECT