PostgreSQL предоставляет следующие типы блокировок для управления конкурентным доступом:
- Shared Lock (SHARE UPDATE EXCLUSIVE, SHARE, SHARE ROW EXCLUSIVE, EXCLUSIVE): Разрешает другим транзакциям выполнять параллельные операции чтения, но блокирует некоторые виды записи или других блокировок.
- Exclusive Lock (ACCESS EXCLUSIVE): Предотвращает доступ к объекту со стороны любых других транзакций, включая чтение.
- Row-level Lock (FOR UPDATE, FOR SHARE): Блокирует доступ к конкретным строкам таблицы. Позволяет другим транзакциям читать эти строки (кроме
FOR UPDATE), но блокирует их изменение.
- Page-level Lock: Низкоуровневая блокировка, используемая при модификации страниц данных в буферном кэше. Обычно не видна пользователям напрямую.
- Table-level Lock: Блокировка, применимая ко всей таблице. Может быть поставлена явно (
LOCK TABLE) или неявно при выполнении DDL-операций.
- Advisory Lock: Прикладные блокировки, управляемые пользователем. Не накладываются автоматически, а используются для синхронизации в логике приложения. Могут быть сессионными или транзакционными.
Примеры использования блокировок:
sql
Тип блокировки, используемой автоматически при выполнении операторов DML (INSERT, UPDATE, DELETE), зависит от конкретной операции и настроек изоляции транзакций.
| Тип операции | Автоматически накладываемые блокировки |
|---|
| SELECT | Не накладывает исключительные блокировки; зависит от уровня изоляции |
| INSERT | RowExclusiveLock |
| UPDATE | RowExclusiveLock (на изменяемые строки) |
| DELETE | RowExclusiveLock (на удаляемые строки) |