Назад к вопросам
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;