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

问题描述 投票:0回答:1

我正在使用以下方法将CSV文件中的数据导入到Postgres表中 copy from 这样的命令

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

当这个命令执行的时候,我在新的终端上打开了一个新的SQL会话,但是在这个新的会话中,我不能执行 select 命令。它将被卡住,直到事务在第一个会话中被提交。同样的问题也发生在我在python程序中使用 copy_expert 指挥 Psycopg2虽说我已经创建了具有池化功能的connection_engine,但是否有可能防止Postgres在将数据复制到表中时阻止er会话?

python sql postgresql sqlalchemy psycopg2
1个回答
1
投票

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

也许COPY是在同一个事务中发生的,而这个事务是在同一个被SELECTed的表上获得一个强锁(比如TRUNCATE)。 或者你的SELECT正在调用一些用户定义的函数(可能是直接的,也可能是通过触发器之类的),这些函数获得了比SELECT通常要求的更强的锁。

在没有类似这些特殊条件的情况下,我没有问题同时运行COPY和SELECT。


0
投票

这是不可能的,除非你使用 SELECT ... FOR UPDATE,它试图在已经由 COPY.

这是PostgreSQL中的一个原则,读者不阻挡写作者,反之亦然。

© www.soinside.com 2019 - 2024. All rights reserved.