java—当从另一个示例中的事务性方法调用spring非事务性方法时,事务是否会被传播?

sczxawaw  于 2021-07-11  发布在  Java
关注(0)|答案(1)|浏览(474)

抱歉,如果之前已经讨论过这个问题,我只是在@transactional spring java annotation的所有相关讨论中都找不到答案。
如果我们在另一个没有@transactional注解的示例中从一个有@transactional注解的方法中调用一个方法,会发生什么?@transactional annotated方法中的事务是否将被挂起?还是会被传播?
我发现有很多关于第二个方法的调用是否来自同一个示例的讨论,但是第二个非事务性方法是否在另一个示例中的讨论却不多。谢谢你的帮助!
像下面的例子一样,如果从类a的methoda()调用类b中的methodb(),会发生什么?methoda中的事务是传播的还是非事务的?
示例代码如下:

public class A
{

@Autowired
B b;

@Transactional
public void methoda(){

  b.methodb();

}

}

@Component
public class B
{
//this method is non transactional and is called from method A in class A
public void methodb()
{
  //do some db updates
}

}
cnh2zyt3

cnh2zyt31#

如果b中没有@transactional注解来告诉它,那么b方法使用在调用a.methoda中建立的事务。这对于spring来说是正常的,我们有标记为transactional的组件,这些组件调用参与当前事务的dao,而本身没有标记为transactional。
如果确实要挂起当前事务,可以将此注解添加到b方法:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

关于在spring api文档中挂起事务有一个警告:
注意:实际的事务暂停并不是在所有事务管理器上都是开箱即用的。这尤其适用于jtatransactionmanager,它要求javax.transaction.transactionmanager对其可用(在标准JavaEE中是特定于服务器的)。

相关问题