从另一个@Transactional注释方法中调用@Transactional注释方法

Onk*_*ade 2 java spring transactions spring-boot

当我从另一个事务方法调用一个事务方法,现在我的第二个事务方法完成,又回到第一个事务方法时,会发生什么,不幸的是它失败了,所以它将回滚所有内容,这意味着它将回滚第二个事务方法的更改.. ?? 注意:两种方法都在同一个类中

@Transactional 
public void method1(){
   //do something
   call method2();
  //do something
  ...
  ...
  failed here
}

@Transactional
public void method2(){
  //do something
  save()
}
Run Code Online (Sandbox Code Playgroud)

因此,在上面的示例中,它会回滚我在第二个事务处理方法中保存的内容吗?

Chr*_*der 5

它取决于txType。默认情况下是必需的。因此,第一个方法启动事务,并且对method2的调用使用相同的事务。

还要注意,同一对象内的方法调用不会触发事务处理。通常,事务处理作为代理处理,仅在调用注入的其他bean时起作用。在您的示例中,您不会发现任何区别。

如果method1不是@Transactional而method2是,则这很重要。在这种情况下,将根本没有交易。

  • “还要注意,同一对象内的方法调用不会触发事务处理” - 这是否意味着 method2 将成为 method1 事务的一部分? (2认同)
  • 它将成为事务的一部分,因为事务在 method1 启动时启动,并在 method1 结束时结束。其间所有不调整事务的调用都将参与。因此,在这种情况下,method2 是否被注释并没有什么区别。 (2认同)

Kay*_*man 5

如果两个方法都在同一个类中,从同一个类的另一个方法调用@Transactional时甚至不会考虑注释。你在那里放了什么并不重要,即使你把它放在外面。仍然会有一个由 启动的事务,但是你会被困在那个事务中。method1()

如果第二种方法在一个单独的类中,您可以使用Propagation.REQUIRES_NEW它在自己的事务中运行,这意味着即使method1()稍后失败,method2()仍然会进行任何更改。

REQUIRED如果不存在,则默认事务传播将启动新事务,或加入现有事务。同样,在单独的类情况下,它会导致在失败method2()时所做的任何更改的回滚method1()