我正在使用copy from
这样的命令将数据从CSV文件导入到Postgres表中
copy tbl_name(col1, col2, col3) from '/sample.csv' delimiter ',';
命令在事务中执行(读写)。
在执行此命令时,我在新终端中打开一个新的SQL会话,但是在此新会话中,我无法执行select
命令。它会一直停留到在第一个会话中提交事务为止。
当我在python程序中使用copy_expert
的{{1}}命令复制文件时,甚至通过池创建connection_engine时,都会发生相同的问题。
将数据复制到表中时,是否可以防止Postgres阻止er会话?
答案 0 :(得分:1)
这不是普遍现象。这里发生的事情比您告诉我们的要多。
也许COPY发生在与其他事物相同的事务中,而其他事物在从中选择的同一张表上获得了强锁(例如TRUNCATE)。也许您的SELECT正在调用某些用户定义的函数(也许直接通过触发器或其他方式),该函数获得的锁定比SELECT通常需要的更强。
在没有诸如此类的特殊条件的情况下,我可以同时运行COPY和SELECT。
答案 1 :(得分:0)
这是不可能的,除非您使用SELECT ... FOR UPDATE
,它会尝试在已被COPY
锁定的行上放置行锁定。
这是PostgreSQL中的一个原则,即读者不阻止作者,反之亦然。