PostgreSQL COPY 方法需要什么锁?

sam*_*mai 3 postgresql locking pg-dump psql

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

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

Lau*_*lbe 5

编辑:

下面描述的行为被识别为错误并在 PostgreSQL v13 中修复。现在COPY TO将持有锁直到事务结束。


COPY从DoCopyin的来源可以看出所采取的锁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));
Run Code Online (Sandbox Code Playgroud)

这意味着:

  • COPY <table> FROM需要一个ROW EXCLUSIVE锁,就像INSERT,UPDATE和 一样DELETE。

  • COPY <table> TO需要一把ACCESS SHARE锁,就像SELECT

  • 与 不同SELECT,COPY <table> TO在事务结束之前不会持有锁,而是立即释放它。

这与事务隔离级别无关。

pg_dump用于COPY转储表内容,因此上述所有内容也适用于 pg_dump。pg_dump始终使用REPEATABLE READ隔离级别来获取整个数据库的一致快照。