Я проверяю, как работает @TransactionalEventListener
, и я нашел то, что не понимаю.
У меня есть простой тест:
, который сначала запускается customerService
, чтобы создать новый Customer
. Тогда я просто проверяю, все ли успешно сохранено в базе данных.
У меня есть 3 сценария ios:
1)
Итак, я запускаю createCustomer
, помеченный @Transactional
, чтобы мы могли видеть новую транзакцию был создан. Затем событие отправляется, и мы запускаем код от слушателя. Внутри него, как описано в java do c, @TransactionalEventListener
закроет транзакцию, но она все еще будет доступна.
Документация
Именно поэтому он все еще присутствует в слушателе. Затем мы запускаем метод generateToken
и, поскольку это не @Transactional
, он будет принимать транзакцию от слушателя. И поскольку транзакция была зафиксирована ранее, обновление больше не будет обрабатываться.
2) Правильное поведение:
Теперь я применил предложение, которое они внесли в документацию, поэтому я пометил метод generateToken
с помощью @Transactional(propagation = Propagation.REQUIRES_NEW)
и все работает нормально. Конечно, теперь внутри generateToken
метода у нас есть новая транзакция.
3)
В этом сценарии я изменяю только то, что оставляю метод genereateToken
только с @Transactional
. И теперь он снова не работает, как в сценарии 1), но, как я вижу в отладчике, Spring создал новую транзакцию, подобную сценарию 2).
И я понятия не имею, почему Spring создал эту новую транзакцию и почему она не работает.