我正在检查@TransactionalEventListener
的工作方式,发现了一些我不理解的东西。
首先运行customerService
来创建新的Customer
。
然后,我只是检查是否所有内容都已成功保存在数据库中。
我有3种情况:
因此,我运行createCustomer
,它用@Transactional
注释,以便我们可以看到新事务已创建。然后发送事件,然后我们从侦听器运行代码。在其内部,如java doc中所述,@TransactionalEventListener
将关闭事务,但仍然可用。
这就是为什么它仍在侦听器中显示的原因。然后,我们运行generateToken
方法,由于它不是@Transactional
,它将从侦听器获取事务。而且由于该事务之前已经提交,所以将不再处理更新。
现在我应用了他们在文档中提出的建议,因此我用generateToken
注释了@Transactional(propagation = Propagation.REQUIRES_NEW)
方法,并且一切正常。当然,现在在generateToken
方法中,我们有了新事务。
在这种情况下,我唯一要更改的是仅将genereateToken
留给@Transactional
方法。现在它不再像方案1)一样工作,但是正如我在调试器中看到的那样,Spring创建了一个新的事务,如方案2)。
我不知道为什么Spring创建了这个新事务,为什么它不起作用。