sam*_*mai 3 postgresql locking pg-dump psql
我想知道 COPY 方法可能需要的锁。当我运行它时,我看到它使用了锁SHARE ACCESS,我想知道它是否是唯一的。
我也想知道之间的区别COPY和pg_dump。他们在幕后使用相同的方法吗?他们需要相同的锁吗?他们可以使用相同的事务隔离级别吗?
下面描述的行为被识别为错误并在 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隔离级别来获取整个数据库的一致快照。
| 归档时间: |
|
| 查看次数: |
774 次 |
| 最近记录: |