Во время выполнения процесса я открываю две транзакции:
Однако после выполнения метода второй транзакции, если я запрашиваю базу данных, значение еще не было обновлено. Я ожидал, что после того, как выполнение метода с аннотацией @transactional закончено, объект уже передан в базу данных.
Воспроизведение ситуации в проекте: https://github.com/emersonl91/quarkus-test
Важные строки: https://github.com/emersonl91/quarkus-tests/blob/master/code-with-quarkus/src/main/java/org/acme/MyService.java#L32
https://github.com/emersonl91/quarkus-tests/blob/master/code-with-quarkus/src/test/java/org/acme/ExampleResourceTest.java#L37
Редактировать 1 : Я проверил классы UserTransaction и TransactionManager, но такая же проблема также возникает.
Edit 2: В методеactionTest я добавил аннотацию @transactional (NOT_SUPPORTED) , в методах сохранения и обновления я добавил аннотацию @transactional (REQUIRES_NEW). Результат не изменился.
Требуется уровень распространения транзакции по умолчанию. Таким образом, если один метод (аннотированный @Transactional) вызывает другой метод (аннотированный @Transactional), второй метод будет использовать существующую транзакцию первого метода, а не создавать новую. Чтобы форсировать новую транзакцию для второго метода, необходимо изменить уровень распространения второго метода на REQUIRES_NEW. Тем не менее, я никогда не нашел вариант использования для этого.
См. https://www.baeldung.com/spring-transactional-propagation-isolation
Что произойдет, если вы перейдете @Transactional к методу transactionTest()?
@Transactional
transactionTest()