Оптимистическая блокировка — это механизм управления конкурентностью данных, при котором транзакции выполняются без предварительного захвата эксклюзивных блокировок. Конфликт фиксируется только в момент попытки записи: если версия записи изменилась с момента чтения, операция отклоняется. Это исключает взаимные блокировки (deadlocks), так как транзакция не удерживает ресурсы до завершения всей операции.
Принцип работы и отличие от пессимистической модели
Пессимистическая блокировка работает по принципу «защиты на всякий случай». Транзакция сразу же захватывает эксклюзивную блокировку (X-lock) при попытке записи. Это гарантирует целостность данных, но создает риск взаимных блокировок: если две транзакции одновременно захватят блокировки чтения (S-lock), они могут ждать друг друга бесконечно.
Оптимистическая блокировка строится на предположении, что конфликты редки. Транзакция читает данные, вычисляет их текущую версию и выполняет все изменения локально в памяти. Только в конце операции она пытается применить изменения к базе данных, проверяя актуальность версии.
Ключевое отличие: в пессимистической модели конфликт обнаруживается сразу при попытке записи (блокировка уже есть), а в оптимистической — только при попытке фиксации изменений. Если версия записи изменилась, транзакция отклоняется.
Алгоритм реализации транзакции с использованием оптимистического подхода
1. Чтение и фиксация версии: Транзакция начинает работу, читает данные целевой записи и сохраняет текущую версию (например, timestamp или номер версии) в локальном контексте.
2. Выполнение операций: Пользователь вносит изменения в свои локальные копии данных. Система не блокирует запись в базе данных на этом этапе, что позволяет другим транзакциям работать параллельно.
3. Проверка актуальности: Перед фиксацией изменений система сравнивает сохраненную версию с текущей версией записи в базе данных. Если версия совпадает, изменения применяются.
4. Обработка конфликта: Если версия не совпала (данные изменились), транзакция отклоняется. Пользователю возвращается ошибка и предлагается повторить попытку с обновленными данными.
Как оценить результат и какие есть ограничения
Оценка эффективности: Увеличение пропускной способности системы за счет параллельного выполнения операций чтения и записи. Снижение времени отклика на запросы, так как не требуется ждать освобождения блокировок.
Ограничения: Метод подходит для систем с низкой частотой конфликтов записи. В высококонкурентных средах (например, банковские переводы в реальном времени) количество отказов из-за конфликтов версий может стать критическим.
Необходимость поддержки повторных попыток: Реализация требует надежной логики retry для транзакций, столкнувшихся с конфликтом. Без этого пользователи будут видеть постоянные ошибки.
Практические примеры и варианты решений
Пример 1: Система бронирования билетов. Два пользователя пытаются купить одно место. Первый читает наличие места, второй тоже видит его. Оба вносят изменения локально. При фиксации первый успешно резервирует билет, второй получает ошибку версии.
Пример 2: Редактор документов. Несколько пользователей редактируют один файл. Система позволяет им работать параллельно, но при сохранении проверяет версию. Если кто-то сохранил файл раньше, изменения другого будут отклонены или предложено перезаписать.
Ошибки при реализации
Игнорирование конфликтов: Попытка продолжить работу с устаревшими данными без проверки версии приводит к потере изменений.
Отсутствие логики retry: Пользователь видит ошибку и не понимает, что нужно повторить попытку. Это снижает доверие к системе.
Некорректная проверка версии: Сравнение только по времени может быть недостаточно точным. Лучше использовать уникальные идентификаторы версий.
Вопросы и ответы
Как избежать бесконечных циклов повторных попыток?
Внедрите лимит на количество попыток (например, 3 раза) и предложите пользователю вручную обновить данные или обратиться в поддержку после исчерпания лимита.
Можно ли использовать оптимистическую блокировку для всех типов данных?
Нет. Для критически важных данных с высокой конкуренцией лучше подходит пессимистическая модель или гибридный подход.


