Ответ
Оптимистичная блокировка (Optimistic Locking) — это стратегия управления конкурентным доступом к данным, которая предполагает, что конфликты между транзакциями редки. Вместо блокировки записи на время транзакции, она проверяет, не изменились ли данные с момента их чтения, непосредственно перед записью.
Принцип работы:
- При чтении данных сохраняется их версия (например, числовой счетчик или timestamp).
- При обновлении в запрос
UPDATEдобавляется условиеWHERE version = [прочитанная_версия]. - Если условие не выполняется (версия изменилась другой транзакцией), возникает конфликт, и операция откатывается.
Реализация в 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 системы, частые конфликты |
Почему это важно? Оптимистичная блокировка повышает производительность и масштабируемость приложений, избегая долгих блокировок в БД, но требует реализации логики повторных попыток или уведомления пользователя о конфликте.