Назад к вопросам
Middle+
109
questionbank
Какие существуют типы блокировок в PostgreSQL?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
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: Прикладные блокировки, управляемые пользователем. Не накладываются автоматически, а используются для синхронизации в логике приложения. Могут быть сессионными или транзакционными.
Примеры использования блокировок:
// Блокировка на уровне строк для последующего обновления
SELECT * FROM users WHERE status = 'pending' FOR UPDATE;
// Явная блокировка таблицы в режиме SHARE
LOCK TABLE orders IN SHARE MODE;
Тип блокировки, используемой автоматически при выполнении операторов DML (INSERT, UPDATE, DELETE), зависит от конкретной операции и настроек изоляции транзакций.
| Тип операции | Автоматически накладываемые блокировки |
|---|---|
| SELECT | Не накладывает исключительные блокировки; зависит от уровня изоляции |
| INSERT | RowExclusiveLock |
| UPDATE | RowExclusiveLock (на изменяемые строки) |
| DELETE | RowExclusiveLock (на удаляемые строки) |