РЕДАКТИРОВАТЬ:
Поведение, описанное ниже, было признано ошибкой и исправлено в 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
для получения согласованного снимка всей базы данных.