← Назад ко всем вопросам

Что такое блокировки в БД?

1️⃣ Как кратко ответить

Блокировки в базе данных — это механизм управления доступом к данным, который предотвращает одновременное изменение одних и тех же данных несколькими транзакциями. Они обеспечивают целостность и согласованность данных, предотвращая конфликты и аномалии, такие как "грязное" чтение, потерянные обновления и фантомные чтения.

2️⃣ Подробное объяснение темы

Блокировки в базе данных — это ключевой механизм, который обеспечивает целостность и согласованность данных при одновременном доступе к ним несколькими пользователями или процессами. Они позволяют управлять конкурентным доступом к данным, предотвращая ситуации, когда несколько транзакций пытаются изменить одни и те же данные одновременно.

Зачем нужны блокировки?

Блокировки необходимы для предотвращения конфликтов и аномалий, которые могут возникнуть при параллельной работе с базой данных. Без блокировок возможны следующие проблемы:

  • Грязное чтение (Dirty Read): Одна транзакция может прочитать данные, которые были изменены другой транзакцией, но еще не зафиксированы. Если вторая транзакция откатится, первая транзакция будет иметь недействительные данные.
  • Потерянные обновления (Lost Update): Две транзакции могут одновременно изменить одни и те же данные, и одно из изменений будет потеряно.
  • Неповторяющееся чтение (Non-repeatable Read): Данные, прочитанные одной транзакцией, могут быть изменены другой транзакцией до завершения первой.
  • Фантомное чтение (Phantom Read): Одна транзакция может увидеть изменения в наборе данных, сделанные другой транзакцией, например, добавление новых строк, которые не существовали при первом чтении.

Как работают блокировки?

Блокировки могут быть реализованы на разных уровнях: на уровне строк, страниц, таблиц или всей базы данных. Основные типы блокировок:

  • Эксклюзивная блокировка (Exclusive Lock): Позволяет только одной транзакции изменять данные. Другие транзакции не могут ни читать, ни изменять данные, пока не будет снята блокировка.
  • Разделяемая блокировка (Shared Lock): Позволяет нескольким транзакциям читать данные, но не изменять их. Это предотвращает изменения данных, пока они читаются.

Пример использования блокировок

Рассмотрим пример на SQL, где две транзакции пытаются изменить одну и ту же запись в таблице:

-- Транзакция 1
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1; -- Чтение данных
UPDATE accounts SET balance = balance + 100 WHERE account_id = 1; -- Изменение данных
COMMIT;
​
-- Транзакция 2
BEGIN TRANSACTION;
SELECT * FROM accounts WHERE account_id = 1; -- Чтение данных
UPDATE accounts SET balance = balance - 50 WHERE account_id = 1; -- Изменение данных
COMMIT;
  • BEGIN TRANSACTION; — начало транзакции. Это указывает на начало последовательности операций, которые должны быть выполнены атомарно.
  • SELECT * FROM accounts WHERE account_id = 1; — чтение данных из таблицы accounts для определенного account_id. Если используется разделяемая блокировка, другие транзакции могут также читать эти данные, но не изменять их.
  • UPDATE accounts SET balance = balance + 100 WHERE account_id = 1; — изменение данных. Здесь устанавливается эксклюзивная блокировка, чтобы другие транзакции не могли ни читать, ни изменять эти данные до завершения текущей транзакции.
  • COMMIT; — фиксация изменений. После этого блокировки снимаются, и другие транзакции могут получить доступ к данным.

Где применяются блокировки?

Блокировки применяются в системах управления базами данных (СУБД) для обеспечения согласованности данных в многопользовательской среде. Они особенно важны в системах, где данные часто изменяются и к ним осуществляется одновременный доступ, например, в банковских системах, системах управления запасами и других критически важных приложениях.

Тема: Базы данных
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки