Назад к вопросам
Middle
66
questionbank
Что такое блокировки (локи) в базе данных?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Блокировки в базе данных — это механизмы, используемые для контроля конкурентного доступа к данным. Они гарантируют целостность и согласованность данных при одновременной работе нескольких пользователей или процессов.
Основные типы блокировок:
- Разделяемая блокировка (Shared Lock / Read Lock): Позволяет нескольким транзакциям одновременно считывать один и тот же ресурс. Не мешает другим транзакциям накладывать разделяемые блокировки, но препятствует наложению эксклюзивных блокировок.
- Эксклюзивная блокировка (Exclusive Lock / Write Lock): Позволяет только одной транзакции изменять ресурс в данный момент времени. Препятствует наложению любых других блокировок (разделяемых или эксклюзивных) на этот ресурс.
Уровни блокировок:
- Блокировка на уровне строки: Блокирует отдельную строку. Обеспечивает высокую степеньConcurrency, но может создавать большой объем накладных расходов.
- Блокировка на уровне страницы: Блокирует страницу данных, содержащую несколько строк. Компромисс междуConcurrency и накладными расходами.
- Блокировка на уровне таблицы: Блокирует всю таблицу. Низкий уровеньConcurrency, но минимальные накладные расходы. Использование ограничено, например, при выполнении масштабных операций изменения схемы.
Механизмы управления блокировками:
- Двухфазная блокировка (Two-Phase Locking - 2PL): Протокол, гарантирующий сериализуемость транзакций. Состоит из двух фаз: фазы роста (транзакция может только запрашивать блокировки) и фазы сокращения (транзакция может только освобождать блокировки, но не запрашивать новые).
- Многоверсионный контроль параллелизма (Multi-Version Concurrency Control - MVCC): Позволяет считывающим транзакциям не блокировать пишущие транзакции. Хранит несколько версий данных, позволяя транзакциям работать с "снимком" данных на определенный момент времени.
Проблемы, решаемые блокировками:
- Потерянные обновления (Lost Updates): Когда две транзакции считывают одни и те же данные, каждая их изменяет, и последнее изменение одной транзакции перезаписывает изменение другой.
- Грязные чтения (Dirty Reads): Когда транзакция считывает данные, измененные другой транзакцией, которая еще не зафиксировала свои изменения. Если вторая транзакция откатится, считанные данные окажутся неверными.
- Неповторяющиеся чтения (Non-Repeatable Reads): Когда транзакция считывает одни и те же данные дважды, и между чтениями другая транзакция изменяет (обновляет или удаляет) эти данные.
- Фантомные чтения (Phantom Reads): Когда транзакция считывает набор строк, и между чтениями вторая транзакция добавляет новые строки, соответствующие условиям выборки первой транзакции.
-- Пример запроса, который может вызвать блокировку строк в PostgreSQL
SELECT *
FROM products
WHERE price < 10
FOR UPDATE; // Накладывает эксклюзивную блокировку на выбранные строки
-- Пример запроса, который может вызвать блокировку таблицы в MySQL
LOCK TABLES my_table WRITE;
-- Операции с my_table
UNLOCK TABLES;