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

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

Ответ

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

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

  1. При чтении данных сохраняется их версия (например, числовой счетчик или timestamp).
  2. При обновлении в запрос UPDATE добавляется условие WHERE version = [прочитанная_версия].
  3. Если условие не выполняется (версия изменилась другой транзакцией), возникает конфликт, и операция откатывается.

Реализация в JPA/Hibernate (аннотация @Version):

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

    @Version // Поле версии автоматически управляется фреймворком
    private Long version;

    // Геттеры и сеттеры
}

При попытке обновить устаревшую сущность JPA выбрасывает OptimisticLockException.

Сравнение с пессимистичной блокировкой: Критерий Оптимистичная Пессимистичная
Подход Проверка при записи Блокировка при чтении
Производительность Выше (нет блокировок) Ниже (блокировки удерживаются)
Конфликты Обрабатываются в коде (try-catch) Предотвращаются блокировкой
Использование Read-heavy системы, редкие обновления Write-heavy системы, частые конфликты

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