@Transactional(propagation = Propagation.REQUIRES_NEW)
public Example updateTotalItem(int id, int newItemNum) {
Example example = exampleRepository.findById(id).orElseThrow(() -> new IllegalArgumentException());
System.out.println(example.getTotalItems + " " + newItemNum);
example.updateTotalItems(newItemNum);
System.out.println(example.getTotalItems + " " + newItemNum);
return exampleRepository.save(example);
}
Приведенный выше пример представляет собой метод, который обновит строку в базе данных, но я обнаружил, что exampleRepository.findById(id)
потенциально вернет строку со старыми данными, если есть два или более одновременных вызова этого метода. Вывод println()
будет выглядеть примерно следующим образом:
10 5
10 5
15 5
15 5
Как видите, вторая транзакция обновляет старые данные, поэтому мне нужно заблокировать этот метод, чтобы убедиться, что условие гонки не бывает. Однако, поскольку моя служба развернута в Kubernetes, на разных модулях выполняется несколько копий кодов, и блокировка больше не работает, если транзакции происходят в разных модулях (поскольку они больше не находятся в одном и том же процессе). Я пытался использовать разные уровни изоляция , чтобы увидеть, можно ли решить эту проблему, но каким-то образом состояние гонки все же возникает. Буду признателен за любую помощь по этой проблеме!