(Весна) JPA / Hibernate: @TransactionalEventListener - странное поведение - PullRequest
0 голосов
/ 12 февраля 2020

Я проверяю, как работает @TransactionalEventListener, и я нашел то, что не понимаю.

У меня есть простой тест: enter image description here

, который сначала запускается customerService, чтобы создать новый Customer. Тогда я просто проверяю, все ли успешно сохранено в базе данных.

У меня есть 3 сценария ios:

1) enter image description here enter image description here enter image description here enter image description here

Итак, я запускаю createCustomer, помеченный @Transactional, чтобы мы могли видеть новую транзакцию был создан. Затем событие отправляется, и мы запускаем код от слушателя. Внутри него, как описано в java do c, @TransactionalEventListener закроет транзакцию, но она все еще будет доступна.

Документация

Именно поэтому он все еще присутствует в слушателе. Затем мы запускаем метод generateToken и, поскольку это не @Transactional, он будет принимать транзакцию от слушателя. И поскольку транзакция была зафиксирована ранее, обновление больше не будет обрабатываться.

2) Правильное поведение: enter image description here enter image description here enter image description here enter image description here

Теперь я применил предложение, которое они внесли в документацию, поэтому я пометил метод generateToken с помощью @Transactional(propagation = Propagation.REQUIRES_NEW) и все работает нормально. Конечно, теперь внутри generateToken метода у нас есть новая транзакция.

3) enter image description here enter image description here enter image description here enter image description here

В этом сценарии я изменяю только то, что оставляю метод genereateToken только с @Transactional. И теперь он снова не работает, как в сценарии 1), но, как я вижу в отладчике, Spring создал новую транзакцию, подобную сценарию 2).

И я понятия не имею, почему Spring создал эту новую транзакцию и почему она не работает.

...