Java 当从另一个实例中的事务性方法调用spring非事务性方法时,事务是否得到传播?

Java 当从另一个实例中的事务性方法调用spring非事务性方法时,事务是否得到传播?,java,spring,spring-jdbc,spring-transactions,Java,Spring,Spring Jdbc,Spring Transactions,很抱歉,如果之前已经讨论过这个问题,我只是在@Transactional spring java annotation的所有相关讨论中都找不到答案 如果我们从具有@Transactional注释的方法调用另一个实例中没有@Transactional注释的方法,会发生什么情况?来自@Transactional注释方法的事务是否将被挂起?还是会被传播 我发现很多讨论都是关于第二个方法的调用是否来自同一个实例,而不是第二个非事务性方法是否在另一个实例中。谢谢你的帮助 如下面的示例中所示,如果从类A中的

很抱歉,如果之前已经讨论过这个问题,我只是在@Transactional spring java annotation的所有相关讨论中都找不到答案

如果我们从具有@Transactional注释的方法调用另一个实例中没有@Transactional注释的方法,会发生什么情况?来自@Transactional注释方法的事务是否将被挂起?还是会被传播

我发现很多讨论都是关于第二个方法的调用是否来自同一个实例,而不是第二个非事务性方法是否在另一个实例中。谢谢你的帮助

如下面的示例中所示,如果从类A中的methoda()调用类B中的methodb(),会发生什么情况?methoda中的事务是传播的还是methodb是非事务的

示例代码如下:

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
}

}

如果B中没有@Transactional注释告诉它其他情况,那么B方法将使用在调用A.methoda中建立的事务。这对于Spring来说是正常的,我们有标记为transactional的组件,这些组件调用参与当前事务的DAO,而本身没有标记为transactional

如果确实要挂起当前事务,可以向b方法添加:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
关于在Spring API文档中暂停事务,有一个警告:

注意:实际事务暂停不会在所有事务管理器上立即生效。这尤其适用于JtaTransactionManager,它要求提供javax.transaction.TransactionManager(在标准Java EE中是特定于服务器的)


如果B中没有@Transactional注释告诉它其他情况,那么B方法将使用在调用A.methoda中建立的事务。这对于Spring来说是正常的,我们有标记为transactional的组件,这些组件调用参与当前事务的DAO,而本身没有标记为transactional

如果确实要挂起当前事务,可以向b方法添加:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
关于在Spring API文档中暂停事务,有一个警告:

注意:实际事务暂停不会在所有事务管理器上立即生效。这尤其适用于JtaTransactionManager,它要求提供javax.transaction.TransactionManager(在标准Java EE中是特定于服务器的)


令人惊叹的!这正是我要找的。谢谢你的帮助@乔娜:当然可以。更多信息请访问。spring所做的比人们所知道的要多得多,本文很好地展示了它。太棒了!这正是我要找的。谢谢你的帮助@乔娜:当然可以。更多信息请访问。spring所做的事情比人们所知道的要多得多,本文很好地介绍了它。