【问题标题】:copy command blocks other sessions in postgres复制命令阻止 postgres 中的其他会话
【发布时间】:2020-10-05 11:23:38
【问题描述】:

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

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

命令在事务中执行(读写)。 在执行此命令时,我将在新终端中打开一个新的 SQL 会话,但在此新会话中,我无法执行 select 命令。它将被卡住,直到在第一个会话中提交事务。 当我在 python 程序中使用Psycopg2copy_expert 命令复制文件时,也会发生同样的问题,即使我已经创建了带有池的connection_engine。 是否可以防止 Postgres 在将数据复制到表中时阻止 er 会话?

【问题讨论】:

  • 它因某种原因而阻塞 - 在数据库中创建正确的数据。如果它不会阻塞并且您开始更改数据库中的数据,那么您可以在数据库中创建混乱。

标签: python sql postgresql sqlalchemy psycopg2


【解决方案1】:

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

也许 COPY 是在同一个事务中发生的,而其他事务在正在从中选择的同一个表上获得强锁(如 TRUNCATE)。或者您的 SELECT 正在调用一些用户定义的函数(可能直接调用,可能通过触发器或其他方式),它正在获取比 SELECT 通常需要的更强的锁定。

在没有这些特殊条件的情况下,我可以同时运行 COPY 和 SELECT。

【讨论】:

  • 实际上,在导入数据之前,我在同一个事务中截断了表。所以我想我需要找到一个不同的解决方案
【解决方案2】:

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

在 PostgreSQL 中,读者不会阻塞写者,反之亦然。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-11
    • 2021-03-12
    • 2021-01-03
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多