postgresql - PostgreSQL COPY 方法需要什么锁?

标签 postgresql locking psql pg-dump

我想知道 COPY 方法可能需要的锁。当我运行它时,我看到它使用了锁SHARE ACCESS,我想知道它是否是唯一的。

我也想知道COPY的区别和 pg_dump .他们在幕后使用相同的方法吗?他们需要相同的锁吗?他们可以使用相同的事务隔离级别吗?

最佳答案

编辑:
下面描述的行为被认为是一个错误和 fixed在 PostgreSQL v13 中。现在 COPY TO将持有锁直到事务结束。
COPY的锁从DoCopy的来源可以看出在 src/backend/commands/copy.c :

if (stmt->relation)
{
    LOCKMODE    lockmode = is_from ? RowExclusiveLock : AccessShareLock;
    [...]

    /* Open and lock the relation, using the appropriate lock type. */
    rel = table_openrv(stmt->relation, lockmode);

    [...]
}
[...]

/*
 * Close the relation. If reading, we can release the AccessShareLock we
 * got; if writing, we should hold the lock until end of transaction to
 * ensure that updates will be committed before lock is released.
 */
if (rel != NULL)
    table_close(rel, (is_from ? NoLock : AccessShareLock));
这意味着:
  • COPY <table> FROM需要一个 ROW EXCLUSIVE锁,就像INSERT , UPDATEDELETE .
  • COPY <table> TO需要一个 ACCESS SHARE锁,就像SELECT
  • 不同于 SELECT , COPY <table> TO直到事务结束才持有锁,而是立即释放它。

  • 这与事务隔离级别无关。pg_dump用途 COPY转储表内容,因此上述所有内容也适用于 pg_dump。 pg_dump始终使用 REPEATABLE READ隔离级别以获得整个数据库的一致快照。

    关于postgresql - PostgreSQL COPY 方法需要什么锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61643550/

    相关文章:

    postgresql - 从 psql 生成空输出

    json - 如何插入 Postgresql JSON 数组

    java - Hibernate 使用大量线程

    .Net4, Monitor.Enter(lockObject, acquiredLock)

    sql - postgresql - 尝试将变量从命令行传递到 sql 脚本时出错

    python - 我正在使用 Peewee,我需要为我的数据库创建迁移文件

    python - 类似 select_related 的函数在 RawQuerySet 中不起作用

    sql - 如何从sql查询中获取第一个和最后一个记录?

    python - 锁定或解锁条件格式单元格 xlsxwriter

    postgresql - 通过提交顺序保证 PostgreSQL 串行列值的单调性