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