https://blog.csdn.net/z69183787/article/details/76208998
https://www.iteye.com/topic/35907
https://sharajava.iteye.com/blog/78270
- PROPAGATION_REQUIRES_NEW,原有事务B新起事务A,事务A中的commit和rollback不会影响外部事务B的commit和rollback,相互独立,如果事务A抛出异常,肯定会影响外部是B的。
- PROPAGATION_NESTED,表示嵌套事务,看如下示例:
ServiceA {
/**
* 事务属性配置为 PROPAGATION_REQUIRED
*/
@Transactional(propagation=Propagation.REQUIRED) // 1
void methodA() {
insertData(); //2
try {
ServiceB.methodB(); //3
} catch (SomeException) {
// 执行其他业务, 如 ServiceC.methodC(); //5
}
updateData(); //6
}
}
ServiceB {
@Transactional(propagation=Propagation.NESTED)
void methodB(){
//
updateData(); //4
}
}
在上面的1,将开起新事务A,2的时候会插入数据,此时事务A挂起,没有commit,3的时候,使用PROPAGATION_NESTED传播,将在3点的时候新建一个savepoint保存2插入的数据,不提交。
- 如果methodB出现异常,将回滚4的操作,不影响2的操作,同时可以处理后面的5,6逻辑,最后一起commit: 2,5,6
- 如果methodB没有出现异常,那么将一起commit: 2,4,6。
- 假如methodB使用的PROPAGATION_REQUIRES_NEW,那么B异常,会commit: 2,5,6,和NESTED一致,如果methodB没有出现异常,那么会先commit4,再commit:6,那么事务将分离开,不能保持一致,假如执行6报错,2和6将回滚,而4却没有被回滚,不能达到预期效果。