Что такое оптимистическая блокировка (Optimistic Locking)?

«Что такое оптимистическая блокировка (Optimistic Locking)?» — вопрос из категории Базы данных, который задают на 26% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Принцип работы:

  1. Каждая версия записи в БД снабжается полем-версией (обычно числом или меткой времени).
  2. Транзакция читает данные вместе с текущей версией.
  3. При попытке обновления транзакция проверяет, что версия записи в БД не изменилась с момента чтения.
  4. Если версия совпадает: обновление выполняется, и значение поля-версии инкрементируется.
  5. Если версия отличается: значит, запись была изменена другой транзакцией позже. Текущая транзакция откатывается с исключением (например, OptimisticLockException). Приложению необходимо обработать этот конфликт (например, повторить операцию с новыми данными).

Реализация в JPA (Hibernate):

@Entity
public class Account {
    @Id
    private Long id;
    private BigDecimal balance;

    @Version // Аннотация для поля-версии
    private Long version; // При каждом UPDATE значение автоматически увеличивается
}

Плюсы и минусы:

Плюсы Минусы
✅ Высокая производительность при редких конфликтах (нет долгих блокировок). ❌ Требует дополнительного поля в таблице.
✅ Избегает взаимоблокировок (deadlocks). ❌ Необходима обработка исключений при конфликтах на уровне приложения.
✅ Хорошо подходит для систем с преимущественно чтением (read-heavy). ❌ Неэффективна при высокой конкуренции на запись (write-heavy), приводит к частым откатам.

Альтернатива: Пессимистическая блокировка, которая блокирует запись на время транзакции, предотвращая конфликты, но снижая параллелизм.