Назад к вопросам
Senior
6
Как реализовать оптимистичную блокировку в коде? Что происходит при конфликте версий?
Компании, где спрашивали
Ecom.tech
Ответ от нейросети
sobes.tech AI
Оптимистичная блокировка — это стратегия управления конкурентным доступом к данным, при которой не ставится явная блокировка при чтении, а проверка на конфликт происходит при записи.
Реализация в Java обычно базируется на версии объекта (например, поле version), которая увеличивается при каждом обновлении. При сохранении проверяется, совпадает ли версия объекта в базе с версией, с которой работал клиент.
Пример:
@Entity
public class Product {
@Id
private Long id;
private String name;
@Version
private Integer version; // поле для оптимистичной блокировки
}
// В сервисе
public void updateProduct(Product updatedProduct) {
Product current = productRepository.findById(updatedProduct.getId()).orElseThrow();
if (!current.getVersion().equals(updatedProduct.getVersion())) {
throw new OptimisticLockingFailureException("Версия объекта устарела");
}
// обновляем поля
current.setName(updatedProduct.getName());
productRepository.save(current);
}
При конфликте версий (когда кто-то другой уже обновил объект и увеличил версию) происходит исключение, которое можно обработать, например, повторить операцию или уведомить пользователя о конфликте. Это предотвращает потерю данных и обеспечивает целостность при конкурентных изменениях.