支持传播的Spring事务

支持传播的Spring事务,spring,transactions,propagation,Spring,Transactions,Propagation,我想了解具有传播支持的spring事务的用途。java文档提到,如果从事务中调用具有@Transactional(propagation=propagation.SUPPORTS)的方法,则该方法支持事务,但如果不存在事务,则该方法以非事务方式执行 这是否已经是spring事务的行为,而不考虑传播。支持 public class ServiceBean { @Transactional(propagation = Propagation.SUPPORTS) public v

我想了解具有传播支持的spring事务的用途。java文档提到,如果从事务中调用具有
@Transactional(propagation=propagation.SUPPORTS)
的方法,则该方法支持事务,但如果不存在事务,则该方法以非事务方式执行

这是否已经是spring事务的行为,而不考虑
传播。支持



public class ServiceBean {

    @Transactional(propagation = Propagation.SUPPORTS)
    public void methodWithSupportsTx() {
        //perform some database operations
    }
}

public class OtherServiceBean {

    @Transactional(propagation = Propagation.REQUIRED)
    public void methodWithRequiredTx() {
        //perform some database operations
        serviceBean.methodWithSupportsTx();
    }
}

在上面的代码示例中,无论
methodWithSupportsTx()
是否具有
@Transactional(传播=传播.支持)
注释,它都将在事务中执行,这取决于
methodWithRequiredTx()
是否具有
@Transactional
注释,对吗


那么,传播级别支持有什么需要/用途呢?

如果不存在所需的事务,则该事务将创建一个新事务。因此,当您调用serviceBean.methodWithSupportsTx()时,将生成一个新事务。如果您的方法是真正的事务性方法,那么如果不存在事务,您将看到spring的错误。

来自:

注意:对于具有事务同步的事务管理器,PROPAGATION_支持与根本没有事务略有不同,因为它定义了同步将应用的事务范围。因此,相同的资源(JDBC连接、Hibernate会话等)将在整个指定范围内共享。请注意,这取决于事务管理器的实际同步配置


因此,这意味着,例如,多次调用Hibernate的
SessionFactory.getCurrentSession()
methodWithSupportsTx()
将返回相同的会话。

假设methodWithSupportsTx()没有@Transactional注释您是想说在事务中调用methodWithSupportsTx()时不会返回相同的会话吗?@Amit:实际上,没有
@Transactional
尝试调用
getCurrentSession()
使用
HibernateTransactionManager
的典型配置将产生“没有绑定到线程的Hibernate会话,并且配置不允许在此创建非事务会话”异常。不,我的意思是,如果methodWithSupportsTx()上没有@transactional注释方法,并且此方法是从已在事务中的另一个方法调用的,在多次调用hibernate的SessionFactory.getCurrentSession()时,hibernate不会返回同一个会话。这正是我在上面的问题中所说的例子-methodWithRequiredTx()上的@Transactional注释创建了一个新事务,然后调用serviceBean.methodWithSupportsTx(),因此methodWithSupportsTx()执行的代码可能已经在事务中了,对吗?@Amit:是的,如果在现有事务中调用该方法,
支持
没有任何区别。确定。所以我的问题是——在哪种情况下,传播级别支持有用?我不这么认为。仅当传播级别从未更改时才会引发错误。此外,PROPAGATION.SUPPORTS不会创建新事务。