Sobes.tech
Назад к вопросам
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);
}

При конфликте версий (когда кто-то другой уже обновил объект и увеличил версию) происходит исключение, которое можно обработать, например, повторить операцию или уведомить пользователя о конфликте. Это предотвращает потерю данных и обеспечивает целостность при конкурентных изменениях.