🤔
Какие бывают блокировки в PostgreSQL? В PostgreSQL существует несколько видов блокировок, которые используются для управления конкурентным доступом к данным и обеспечения целостности транзакций.
🚩
Блокировки уровня таблицы (Table-Level Locks)Эти блокировки применяются к целым таблицам и используются для операций, которые требуют эксклюзивного доступа к таблице.
🟠
ACCESS SHARE:
Блокировка на уровне доступа для чтения данных из таблицы (например, при выполнении команды
SELECT). Не блокирует другие команды
SELECT.
🟠
ROW SHARE:
Блокировка уровня строки, позволяющая другим транзакциям выполнять команды
SELECT FOR UPDATE и
SELECT FOR SHARE.
🟠
ROW EXCLUSIVE:
Блокировка, применяемая при вставке, обновлении или удалении строк (
INSERT,
UPDATE,
DELETE). Блокирует блокировки
SHARE и
EXCLUSIVE.
🟠
SHARE UPDATE EXCLUSIVE:
Используется для выполнения команд, которые обновляют индексы, но не данные (
VACUUM). Блокирует другие блокировки
SHARE UPDATE EXCLUSIVE и более строгие.
🟠
SHARE:
Блокировка для чтения данных из таблицы с возможностью блокировки изменений. Используется для операций, которые должны видеть согласованное состояние данных (
ANALYZE).
🟠
SHARE ROW EXCLUSIVE:
Используется для команд, которые выполняют чтение с возможностью блокировки последующих изменений, таких как
CREATE INDEX CONCURRENTLY.
🟠
EXCLUSIVE:
Блокирует доступ к таблице для всех операций, кроме команд
SELECT и команд с уровнем блокировки
ACCESS SHARE.
🟠
ACCESS EXCLUSIVE:
Самая строгая блокировка, блокирующая все другие операции. Применяется для структурных изменений таблицы (
ALTER TABLE,
DROP TABLE).
🚩
Блокировки уровня строки (Row-Level Locks)Эти блокировки применяются к отдельным строкам таблицы и используются для управления конкурентным доступом к данным на более детальном уровне.
🟠
SELECT FOR UPDATE:
Блокирует выбранные строки для обновления другими транзакциями. Строки с такой блокировкой могут быть изменены только текущей транзакцией.
🟠
SELECT FOR SHARE:
Блокирует строки для чтения, но не для изменения. Другие транзакции могут читать эти строки, но не изменять их.
🟠
SELECT FOR NO KEY UPDATE:
Похоже на
SELECT FOR UPDATE, но позволяет другим транзакциям выполнять операции, не изменяющие ключи.
🟠
SELECT FOR KEY SHARE:
Похоже на
SELECT FOR SHARE, но позволяет другим транзакциям выполнять операции, не изменяющие строки.
🚩
Блокировки на уровне индексов (Index-Level Locks)Эти блокировки применяются к индексам и используются для управления доступом к индексированным данным.
🟠
Блокировки индексов:
Используются автоматически при доступе к индексам для обеспечения целостности данных. Это может включать блокировки при обновлении индексов или их чтении.
🚩
Дедлоки (Deadlocks)Дедлоки возникают, когда две или более транзакций блокируют друг друга, ожидая освобождения ресурсов, которые заблокированы друг другом. PostgreSQL автоматически обнаруживает дедлоки и прерывает одну из транзакций для их разрешения.
🚩
Примеры использования 🟠
Обеспечение целостности данных:
Использование блокировок для предотвращения конкурентных изменений данных.
🟠
Управление конкурентным доступом:
Применение блокировок для управления доступом к ресурсам в многопользовательских средах.
🟠
Оптимизация производительности:
Выбор оптимальных типов блокировок для балансировки между целостностью данных и производительностью.
Ставь 👍 и забирай 📚 Базу знаний