Я занимаюсь разработкой веб-приложение с использованием Spring MVC и имеют такие методы в моем приложении:гонки состояние между транзакциями
@Transactional
public void methodA(Long id, String color) {
Fruit fruit = entityManager.createNamedQuery("Fruit.findById", Fruit.class).setParameter(1, id).getSingleResult();
fruit.setColor("color");
entityManager.merge(fruit);
}
@Transactional
public void methodB(Long id, int price) {
Fruit fruit = entityManager.createNamedQuery("Fruit.findById", Fruit.class).setParameter(1, id).getSingleResult();
fruit.setPrice(price);
entityManager.merge(fruit);
}
Эти два метода часто называют почти в то же самое время, и из-за того, что происходит состояние гонки , Есть ли способ решить эту проблему? Я думаю, что поместить оба из них в один синхронизированный метод не будет хорошей идеей, потому что я ожидаю много вызовов этих методов (тысяч) разными пользователями одновременно, поэтому это может вызвать задержки. Исправьте меня, если я ошибаюсь.
Для чего ваш сложный и дорогой запрос - это просто 'entityManager.find (Fruit.class, id)'. – chrylis
Эти методы находятся в Сервисе или в DAO (или репозитории)? –
@KimAragonEscobar, он находится внутри класса репозитория. Класс репозитория находится внутри класса обслуживания –