Оптимистическая и пессимистическая блокировка в базах данных: в чём разница

Разница между оптимистической и пессимистической блокировкой в базах данных

Что такое блокировка в базах данных и зачем она нужна

Разница между оптимистической и пессимистической блокировкой в базах данных - иллюстрация

Когда несколько пользователей или процессов одновременно обращаются к одной и той же информации в базе данных, возникает риск конфликтов. Чтобы избежать потери данных или их неконсистентности, СУБД применяют различные механизмы блокировки. Эти механизмы позволяют "защитить" строки, таблицы или даже целые базы данных от одновременного изменения. Существует два основных подхода: оптимистическая и пессимистическая блокировка. Разница между оптимистической и пессимистической блокировкой заключается в том, как СУБД «доверяет» параллельным транзакциям.

Оптимистическая блокировка: доверие, но проверка

Оптимистическая блокировка базы данных (optimistic locking) предполагает, что конфликты между транзакциями случаются редко. Поэтому СУБД разрешает параллельные изменения, но перед коммитом проверяет, не изменилась ли запись с момента последнего чтения. Обычно используется специальное поле, например, `version` или `timestamp`, которое обновляется при каждом изменении строки. Если при сохранении значение `version` не совпадает с ожидаемым, транзакция откатывается, и пользователь получает сообщение о конфликте.

Например, в интернет-магазине два оператора могут одновременно редактировать карточку товара. Один меняет описание, другой — цену. При сохранении каждый из них передаёт текущую версию объекта. Если версия не совпадает с той, что в базе, один из них получит ошибку. Такой подход особенно удобен в системах с высокой читаемостью и низкой вероятностью записи — например, в микросервисной архитектуре с REST API.

Плюсы оптимистической блокировки:
- Высокая производительность при низкой конкуренции
- Нет блокирования ресурсов, нет задержек
- Лучше масштабируется в распределённых системах

Минусы:
- Возможны конфликты при записи
- Требуется дополнительная логика проверки версии

Пессимистическая блокировка: лучше перебдеть, чем недобдеть

Пессимистическая блокировка в SQL (pessimistic locking) работает по принципу «лучше заблокировать заранее». Как только транзакция читает или начинает изменять данные, она сразу устанавливает блокировку. Это может быть блокировка строки, страницы или таблицы — в зависимости от настроек СУБД. Другие транзакции, которые хотят прочитать или изменить эти же данные, вынуждены ждать, пока первая транзакция не завершится.

Классический пример — банковская система. Когда клиент переводит деньги, операция должна быть атомарной. Если два запроса одновременно пытаются изменить баланс одного счёта, то блокировка транзакций в базах данных должна гарантировать, что только одна из них выполнится первой, а вторая дождётся окончания.

Основные плюсы:
- Защита от конфликтов на этапе выполнения
- Простая логика обработки транзакций
- Предсказуемое поведение при высокой конкуренции

Минусы:
- Возможны «зависания» из-за долгих блокировок
- Риск взаимных блокировок (deadlocks)
- Может тормозить производительность при большом количестве параллельных запросов

Диаграмма взаимодействия: как это работает

Разница между оптимистической и пессимистической блокировкой в базах данных - иллюстрация

Представим схему работы двух пользователей с одной и той же записью:

Пессимистическая блокировка:
1. Пользователь A начинает транзакцию, читает запись — и сразу блокирует её.
2. Пользователь B пытается прочитать ту же запись, но вынужден ждать.
3. Пользователь A изменяет данные и коммитит транзакцию.
4. Только после этого пользователь B получает доступ.

Оптимистическая блокировка:
1. Пользователь A и пользователь B одновременно читают данные.
2. Каждый вносит свои изменения локально.
3. Пользователь A сохраняет результат — версия данных увеличивается.
4. Пользователь B пытается сохранить, но получает ошибку, так как версия изменилась.

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

Реальные кейсы: из практики разработки

Разница между оптимистической и пессимистической блокировкой в базах данных - иллюстрация

В одной из CRM-систем, где хранились заявки клиентов, команда использовала пессимистическую блокировку на уровне строки. Менеджеры часто открывали одни и те же заявки — чтобы избежать перезаписи данных, при открытии карточки заявка сразу блокировалась. Это устраняло конфликты, но вызывало задержки, когда двое сотрудников пытались работать с одним клиентом. Позже архитекторы перешли на оптимистический подход: при сохранении происходила проверка версии, и пользователь получал уведомление, если кто-то уже изменил данные. Это снизило задержки и улучшило UX.

Другой пример — в системе управления складом. Там использовалась пессимистическая блокировка, потому что одновременно несколько процессов могли резервировать одни и те же товары. Ошибка в логике блокировок привела к взаимной блокировке (deadlock), когда два процесса «захватили» по одному товару и ждали друг друга. После анализа механизмы блокировки в СУБД были переписаны, и внедрено упорядочивание доступа к ресурсам.

Что выбрать: оптимизм или осторожность?

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

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

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

Scroll to Top