我想知道COPY方法可能需要哪些锁。当我运行它时,我看到它使用了SHARE ACCESS锁,我想知道它是否是唯一的锁。
我还想知道 COPY
和 pg_dump
. 他们在引擎盖下使用同样的方法吗?它们需要相同的锁吗?它们可以使用相同的事务隔离级别吗?
下面描述的行为被认为是一个bug,并且... 固定的 在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 TO <table>
意思是: ROW EXCLUSIVE
锁,就像 INSERT
, UPDATE
和 DELETE
.
COPY FROM <table>
需要一个 ACCESS SHARE
锁,就像 SELECT
不同于 SELECT
, COPY FROM <table>
并不保持锁,直到事务结束,而是立即释放它。
这与事务隔离级别无关。
pg_dump
使用 COPY
来转储表的内容,所以以上所有的内容也适用于pg_dump。pg_dump
总是使用 REPEATABLE READ
隔离级别以获得整个数据库的一致快照。