11
Блокировки отношений
Тип ресурса: Relation
Режимы
Access Share SELECT
Row Share SELECT FOR UPDATE/SHARE
Row Exclusive UPDATE, DELETE, INSERT, MERGE
Share Update Exclusive VACUUM, ANALYZE, ALTER TABLE,
СREATE INDEX CONCURRENTLY
Share CREATE INDEX
Share Row Exclusive CREATE TRIGGER, ALTER TABLE
Exclusive REFRESH MATERIALIZED VIEW
CONCURRENTLY
Access Exclusive DROP, TRUNCATE, REINDEX, VACUUM FULL,
LOCK TABLE, ALTER TABLE,
REFRESH MATERIALIZED VIEW
допускают
параллельное
изменение
данных
в таблице
Важный частный случай блокировок — блокировки отношений (таблиц,
индексов, последовательностей и т. п.). Такие блокировки имеют тип
relation в представлении pg_locks.
Для них определено целых 8 различных режимов, которые показаны
на слайде вместе с примерами команд SQL, использующих эти
режимы. Матрица совместимости, которая показывает, какие
блокировки можно захватывать совместно, приведена в документации.
Такое количество режимов существует для того, чтобы позволить
выполнять одновременно как можно большее количество команд,
относящихся к одной таблице (индексу и т. п.).
Самый слабый режим — Access Share, он захватывается командой
SELECT и совместим с любым режимом, кроме самого сильного —
Access Exclusive. Это означает, что запрос не мешает ни другим
запросам, ни изменению данных в таблице, ни чему-либо другому,
но не дает, например, удалить таблицу в то время, когда из нее
читаются данные.
Другой пример: режим Share (как и другие более сильные режимы)
не совместим с изменением данных в таблице. Например, команда
CREATE INDEX заблокирует команды INSERT, UPDATE и DELETE
(и наоборот). Поэтому существует команда CREATE INDEX
CONCURRENTLY, использующая режим Share Update Exclusive,
который совместим с такими изменениями (за счет этого команда
выполняется дольше).