我想知道 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
, UPDATE
和 DELETE
.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/