Открыть сервис

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

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

Концепция и принцип работы

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

Каждая запись или агрегат данных снабжается дополнительным полем, хранящим версию. При чтении данных считывается и текущая версия. Когда транзакция пытается записать изменения, она проверяет, совпадает ли версия данных в БД с версией, прочитанной на старте. Если версии совпадают, это означает, что другие транзакции не модифицировали данные после прочтения — запись разрешается, а версия увеличивается. Если версии различаются, это означает, что другой процесс уже изменил данные, и текущая транзакция должна быть отменена (rolled back) или выполнена повторно.

Типичные механизмы реализации

Алгоритм в общем виде

  1. Считывание состояния. Транзакция A считывает данные и их версию (V1).
  2. Модификация. Транзакция A выполняет вычисления и изменяет данные в локальной памяти (клиентской или серверной). Блокировки на уровне СУБД не устанавливаются.
  3. Запись с проверкой. Транзакция A формирует SQL-запрос на обновление с условием WHERE id = X AND version = V1.
  4. Оценка результата. Если количество строк, затронутых запросом UPDATE, равно 1, это означает, что версия (V1) не изменилась — изменения фиксируются, версия увеличивается до V2. Если количество строк равно 0, это говорит о том, что другая транзакция (B) уже изменила запись и подняла версию до V2 или выше — возникает конфликт.
  5. Обработка конфликта. В случае обнаружения конфликта СУБД или приложение генерирует исключение. Пользователю или процессу предлагается повторить операцию (refetch + retry), либо отменить её.

Области применения

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

Преимущества и недостатки

Преимущества:

Недостатки:

Сравнение с пессимистической блокировкой

ХарактеристикаОптимистическая блокировкаПессимистическая блокировка
Момент блокировкиТолько на этапе фиксации (commit)Сразу при чтении или начале транзакции
Накладные расходы на чтениеНизкиеВысокие (захват и удержание блокировки)
Накладные расходы на записьСредние (дополнительная проверка + возможная отмена)Низкие (ресурс уже гарантированно не изменится)
Риск deadlockПрактически отсутствуетЕсть (особенно при смешанных блокировках)
ПрименимостьНизкая конкуренция, много чтенийВысокая конкуренция, много записей, финансы
Сложность реализацииСредняя (версионирование + retry)Высокая (правильный выбор уровней изоляции)

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

Критика и ограничения

Основным ограничением оптимистической блокировки является невозможность её применения в системах, где требуется гарантированная атомарность операций при очень высокой конкуренции (например, в высоконагруженных интернет-магазинах при продаже ограниченных тиражей). В таких случаях частые откаты транзакций могут полностью парализовать запись. Кроме того, при оптимистическом подходе сложно контролировать долгие транзакции, состоящие из нескольких шагов, так как между чтением и записью проходит много времени, увеличивая окно конфликта.

Некоторые исследователи указывают на то, что оптимистическая блокировка может приводить к каскадному откату транзакций (cascading aborts), поскольку отмена одной транзакции может затронуть множество других, прочитавших её незафиксированные изменения. Однако в современных СУБД (PostgreSQL, Oracle) эта проблема решается на уровне архитектуры MVCC.

Интересные факты

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →