Я хочу убедиться, что только 1 поток имеет доступ к сущности в моей сервисной функции. Как это сделать?
Пример: я хочу безопасно уменьшить количество: даже если несколько потоков выполняют OrderService.remove (Product), я не хочу 2 обновления БД с одинаковым значением счетчика.
В многопоточной среде environemnt 2 потоки могут выполнять эту функцию одновременно, они могут считывать одно и то же значение счетчика и, следовательно, обновлять БД с тем же уменьшенным значением. Это нежелательно.
Продукт:
@Entity
public class Product {
@Id
@GeneratedValue
private UUID id;
private Integer count;
...
ProductService:
@Service
@Transactional
public class ProductService {
public void remove(UUID productId) {
final Product product = productRepository.findById(productId);
// TODO how to lock product, so no other thread can modify it before this operation is committed?
final Integer currentCount = product.getCount();
product.setCount(currentCount-1);
}
}