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

时间:2020-06-15 23:20:37

标签: python sql postgresql sqlalchemy psycopg2

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

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

命令在事务中执行(读写)。 在执行此命令时,我在新终端中打开一个新的SQL会话,但是在此新会话中,我无法执行select命令。它会一直停留到在第一个会话中提交事务为止。 当我在python程序中使用copy_expert的{​​{1}}命令复制文件时,甚至通过池创建connection_engine时,都会发生相同的问题。 将数据复制到表中时,是否可以防止Postgres阻止er会话?

2 个答案:

答案 0 :(得分:1)

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

也许COPY发生在与其他事物相同的事务中,而其他事物在从中选择的同一张表上获得了强锁(例如TRUNCATE)。也许您的SELECT正在调用某些用户定义的函数(也许直接通过触发器或其他方式),该函数获得的锁定比SELECT通常需要的更强。

在没有诸如此类的特殊条件的情况下,我可以同时运行COPY和SELECT。

答案 1 :(得分:0)

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

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