Какие блокировки требует метод PostgreSQL COPY? - PullRequest
0 голосов
/ 06 мая 2020

Я хотел бы знать, какие блокировки могут потребоваться для метода COPY. Когда я запускаю его, я вижу, что он использует блокировку SHARE ACCESS, я хотел бы знать, единственный ли он.

Я также хотел бы узнать разницу между COPY и pg_dump. Используют ли они те же методы под капотом? Нужны ли им одинаковые замки? Могут ли они использовать один и тот же уровень изоляции транзакций?

1 Ответ

0 голосов
/ 06 мая 2020

РЕДАКТИРОВАТЬ:

Поведение, описанное ниже, было признано ошибкой и исправлено в 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 для получения согласованного снимка всей базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...