Spring嵌套事务​​处理和嵌套传播

时间:2012-10-31 06:32:43

标签: spring spring-aop spring-transactions spring-annotations

我有一个下面的场景,我想了解Spring中的嵌套事务处理以及propogation。我实际上对此有足够的了解,但仍然不清楚某些事实。

public class ServiceImpl {
@Autowired 
public AnotherService anotherService;

@Transactional // by default it is PROPOGATION_REQUIRED
public void insert (){
    anotherService.anotherInsert();
}
}

public class AnotherServiceImpl {

@Transactional(propagation = Propagation.NESTED)
public void anotherInsert() {
    insertSomeTestData();
}

private void insertSomeTestData() {
    // call insert some test data recursively
    // insert trasaction
    insertSomeTestData();
}
}

在这种情况下,anotherInsert将为某些数据提交嵌套数据和回滚,这会影响外部事务,这是默认的PROPOGATION_REQUIRED还有不明确的点仍然是,如果事务是嵌套的,在这种情况下他们会开始一个新的吗?

2 个答案:

答案 0 :(得分:2)

以下是NESTED的描述

“如果当前事务存在,则在嵌套事务中执行,或者它的行为类似于PROPAGATION_REQUIRED”

在上述场景中,由于存在一个当前事务,它将继续在嵌套事务下执行,并且不会创建新事务。

如果我错了,请纠正我。感谢

答案 1 :(得分:1)

" AnotherService.anotherInsert" call将在ServiceImpl.insert中已存在的逻辑事务下创建一个嵌套的逻辑事务。

嵌套事务的回滚不会回滚主要事务,如REQUIRES_NEW行为。

规格:

  

PROPAGATION_NESTED使用具有多个的单个物理事务   它可以回滚到的保存点。这种部分回滚允许   内部事务范围,用于触发其范围的回滚   外部交易能够继续物理交易   尽管一些操作已被回滚。这个设置是   通常映射到JDBC保存点,因此只能使用JDBC   资源交易。请参阅Spring的DataSourceTransactionManager。

但是,您应该知道NESTED事务使用单个物理事务基于JDBC保存点。这意味着您必须使用JDBC数据源和以下事务管理器才能使其工作:

  

org.springframework.jdbc.datasource.DataSourceTransactionManager

比照。 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-propagation-nested