Spring, как предотвратить чтение старых данных в параллельных транзакциях (состояние гонки)? - PullRequest
0 голосов
/ 13 февраля 2020
@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, на разных модулях выполняется несколько копий кодов, и блокировка больше не работает, если транзакции происходят в разных модулях (поскольку они больше не находятся в одном и том же процессе). Я пытался использовать разные уровни изоляция , чтобы увидеть, можно ли решить эту проблему, но каким-то образом состояние гонки все же возникает. Буду признателен за любую помощь по этой проблеме!

...