Ответ
Оптимистическая блокировка (Optimistic Locking) — это стратегия управления конкурентным доступом к данным, которая предполагает, что конфликты между транзакциями происходят редко. Вместо физической блокировки записи на всё время транзакции, конфликт обнаруживается и разрешается только в момент фиксации изменений.
Принцип работы:
- Каждая версия записи в БД снабжается полем-версией (обычно числом или меткой времени).
- Транзакция читает данные вместе с текущей версией.
- При попытке обновления транзакция проверяет, что версия записи в БД не изменилась с момента чтения.
- Если версия совпадает: обновление выполняется, и значение поля-версии инкрементируется.
- Если версия отличается: значит, запись была изменена другой транзакцией позже. Текущая транзакция откатывается с исключением (например,
OptimisticLockException). Приложению необходимо обработать этот конфликт (например, повторить операцию с новыми данными).
Реализация в JPA (Hibernate):
@Entity
public class Account {
@Id
private Long id;
private BigDecimal balance;
@Version // Аннотация для поля-версии
private Long version; // При каждом UPDATE значение автоматически увеличивается
}
Плюсы и минусы:
| Плюсы | Минусы |
|---|---|
| ✅ Высокая производительность при редких конфликтах (нет долгих блокировок). | ❌ Требует дополнительного поля в таблице. |
| ✅ Избегает взаимоблокировок (deadlocks). | ❌ Необходима обработка исключений при конфликтах на уровне приложения. |
| ✅ Хорошо подходит для систем с преимущественно чтением (read-heavy). | ❌ Неэффективна при высокой конкуренции на запись (write-heavy), приводит к частым откатам. |
Альтернатива: Пессимистическая блокировка, которая блокирует запись на время транзакции, предотвращая конфликты, но снижая параллелизм.