复制命令阻止 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 程序中,我正在使用 Psycopg2
的 copy_expert
命令复制文件时,会发生同样的问题,即使我已经使用池创建了 connection_engine。
是否可以防止 Postgres 在将数据复制到 table 时阻止 er 会话?
这是不可能的,除非您使用 SELECT ... FOR UPDATE
,它会尝试在已经被 COPY
锁定的行上放置行锁。
PostgreSQL 的原则是读者不会阻塞写入者,反之亦然。
这不是普遍现象。这里发生的事情比你告诉我们的要多。
也许 COPY 发生在同一个事务中,因为其他事务在正在 SELECTed 的同一个 table 上获得强锁(如 TRUNCATE)。或者你的 SELECT 可能正在调用一些用户定义的函数(可能是直接的,可能是通过触发器或其他东西),它正在获取比 SELECT 通常需要的更强的锁。
在没有那些特殊情况的情况下,我没有问题同时运行COPY和SELECT
我正在使用 copy from
这样的命令将数据从 CSV 文件导入到 Postgres table
copy tbl_name(col1, col2, col3) from '/sample.csv' delimiter ',';
命令在事务(读写)中执行。
执行此命令时,我在新终端中打开了一个新的 SQL 会话,但在这个新会话中,我无法执行 select
命令。它将被卡住,直到事务在第一个会话中提交。
在 python 程序中,我正在使用 Psycopg2
的 copy_expert
命令复制文件时,会发生同样的问题,即使我已经使用池创建了 connection_engine。
是否可以防止 Postgres 在将数据复制到 table 时阻止 er 会话?
这是不可能的,除非您使用 SELECT ... FOR UPDATE
,它会尝试在已经被 COPY
锁定的行上放置行锁。
PostgreSQL 的原则是读者不会阻塞写入者,反之亦然。
这不是普遍现象。这里发生的事情比你告诉我们的要多。
也许 COPY 发生在同一个事务中,因为其他事务在正在 SELECTed 的同一个 table 上获得强锁(如 TRUNCATE)。或者你的 SELECT 可能正在调用一些用户定义的函数(可能是直接的,可能是通过触发器或其他东西),它正在获取比 SELECT 通常需要的更强的锁。
在没有那些特殊情况的情况下,我没有问题同时运行COPY和SELECT