PostgreSQL COPY方法需要哪些锁?

问题描述 投票:0回答:1

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

我还想知道 COPYpg_dump. 他们在引擎盖下使用同样的方法吗?它们需要相同的锁吗?它们可以使用相同的事务隔离级别吗?

postgresql locking psql pg-dump
1个回答
0
投票

EDIT:

下面描述的行为被认为是一个bug,并且... 固定的 在PostgreSQL v13中。现在 COPY TO 将保持锁,直到交易结束。


的锁 COPY 从源头上可以看出 DoCopysrc/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 TO <table> 意思是: ROW EXCLUSIVE 锁,就像 INSERT, UPDATEDELETE.

  • COPY FROM <table> 需要一个 ACCESS SHARE 锁,就像 SELECT

  • 不同于 SELECT, COPY FROM <table> 并不保持锁,直到事务结束,而是立即释放它。

这与事务隔离级别无关。

pg_dump 使用 COPY 来转储表的内容,所以以上所有的内容也适用于pg_dump。pg_dump 总是使用 REPEATABLE READ 隔离级别以获得整个数据库的一致快照。

© www.soinside.com 2019 - 2024. All rights reserved.