我正在使用以下方法将CSV文件中的数据导入到Postgres表中 copy from
这样的命令
copy tbl_name(col1, col2, col3) from '/sample.csv' delimiter ',';
当这个命令执行的时候,我在新的终端上打开了一个新的SQL会话,但是在这个新的会话中,我不能执行 select
命令。它将被卡住,直到事务在第一个会话中被提交。同样的问题也发生在我在python程序中使用 copy_expert
指挥 Psycopg2
虽说我已经创建了具有池化功能的connection_engine,但是否有可能防止Postgres在将数据复制到表中时阻止er会话?
这不是一个普遍现象。 这里发生的事情比你告诉我们的要多。
也许COPY是在同一个事务中发生的,而这个事务是在同一个被SELECTed的表上获得一个强锁(比如TRUNCATE)。 或者你的SELECT正在调用一些用户定义的函数(可能是直接的,也可能是通过触发器之类的),这些函数获得了比SELECT通常要求的更强的锁。
在没有类似这些特殊条件的情况下,我没有问题同时运行COPY和SELECT。
这是不可能的,除非你使用 SELECT ... FOR UPDATE
,它试图在已经由 COPY
.
这是PostgreSQL中的一个原则,读者不阻挡写作者,反之亦然。