(春季)JPA /休眠:@TransactionalEventListener-奇怪的行为

时间:2020-02-11 22:36:02

标签: java spring hibernate jpa transactions

我正在检查@TransactionalEventListener的工作方式,发现了一些我不理解的东西。

我有一个简单的测试: enter image description here

首先运行customerService来创建新的Customer。 然后,我只是检查是否所有内容都已成功保存在数据库中。

我有3种情况:

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

因此,我运行createCustomer,它用@Transactional注释,以便我们可以看到新事务已创建。然后发送事件,然后我们从侦听器运行代码。在其内部,如java doc中所述,@TransactionalEventListener将关闭事务,但仍然可用。

Documentation

这就是为什么它仍在侦听器中显示的原因。然后,我们运行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创建了这个新事务,为什么它不起作用。

0 个答案:

没有答案