我有一个下面的场景,我想了解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
还有不明确的点仍然是,如果事务是嵌套的,在这种情况下他们会开始一个新的吗?
答案 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