2

我有一个下面的场景,我想了解 Spring 中的嵌套事务处理以及传播。我实际上已经阅读了足够多的内容,但仍然不清楚一些事实。

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另外不清楚的一点是,如果事务嵌套,他们会在这种情况下开始一个新的事务吗?

4

2 回答 2

2

这是嵌套的描述

“如果当前事务存在,则在嵌套事务中执行,否则它将表现得像 PROPAGATION_REQUIRED 一样”

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

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

于 2012-10-31T07:01:14.127 回答
2

“AnotherService.anotherInsert”调用将在 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

于 2015-10-27T14:06:18.100 回答