Spring Transaction属性之Propagation
来源:互联网 发布:淘宝瑞滢星星口碑 编辑:程序博客网 时间:2024/05/17 09:24
一、描述
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时,
内层Service的方法被调用时,外层方法的事务被挂起;
内层事务相对于外层事务是完全独立的,有独立的隔离性等等。
二、实验
但实验时却遇到一个奇怪的问题:
@Service
public class A {
@Autowired
private OrderApplyMapper orderApplyMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public int testB(OrderApply order) {
return orderApplyMapper.save(order);
}
@Transactional
public void testA(OrderApply order) {
System.out.println("1111111111111");
testB(order);
System.out.println("2222222222222");
throw new RuntimeException();
}
}
@Service
public class B {
@Autowired
private OrderApplyMapper orderApplyMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public int testB(OrderApply order) {
return orderApplyMapper.save(order);
}
}
1、当A.testA()方法调用B.testB()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。
2、当A.testA()方法调用A.testB()方法时,内层事务不能正确地提交或回滚。
三、分析和结论
1、method_Two()会不会创建一个新事务?
答:不会创建。仔细查看了日志,没有找到类似creating new transaction的输出,应该是因为在同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。
那么为什么spring只对跨Service的方法才生效?
Debug代码发现跨Service调用方法时,都会经过org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有经过此处,才能对事务进行控制。
2、不同的Service调用方法时:
如果被调用方法是Propagation.REQUIRES_NEW,被catch后不抛出,事务可以正常提交;
如果被调用方法是Propagation.REQUIRED,被catch后不抛出,后面的代码虽然可以执行下去,但最终还是会分出rollback-only异常;
3、同一个Service中调用方法时:
不论注解是Propagation.REQUIRES_NEW 还是 Propagation.REQUIRED,
其结果都是一样的,就是都被忽略掉了,等于没写。
当其抛出异常时,只需catch住不抛出,事务就可以正常提交。
Spring遇到嵌套事务时,当被嵌套的事务被定义为“PROPAGATION_REQUIRES_NEW”时,
内层Service的方法被调用时,外层方法的事务被挂起;
内层事务相对于外层事务是完全独立的,有独立的隔离性等等。
二、实验
但实验时却遇到一个奇怪的问题:
@Service
public class A {
@Autowired
private OrderApplyMapper orderApplyMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public int testB(OrderApply order) {
return orderApplyMapper.save(order);
}
@Transactional
public void testA(OrderApply order) {
System.out.println("1111111111111");
testB(order);
System.out.println("2222222222222");
throw new RuntimeException();
}
}
@Service
public class B {
@Autowired
private OrderApplyMapper orderApplyMapper;
@Transactional(propagation = Propagation.REQUIRES_NEW, readOnly = false, rollbackFor = Exception.class)
public int testB(OrderApply order) {
return orderApplyMapper.save(order);
}
}
1、当A.testA()方法调用B.testB()方法时,内层事务提交和回滚,都不受外层事务提交或回滚的影响。
2、当A.testA()方法调用A.testB()方法时,内层事务不能正确地提交或回滚。
三、分析和结论
1、method_Two()会不会创建一个新事务?
答:不会创建。仔细查看了日志,没有找到类似creating new transaction的输出,应该是因为在同一个Service类中,spring并不重新创建新事务,如果是两不同的Service,就会创建新事务了。
那么为什么spring只对跨Service的方法才生效?
Debug代码发现跨Service调用方法时,都会经过org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept()方法,只有经过此处,才能对事务进行控制。
2、不同的Service调用方法时:
如果被调用方法是Propagation.REQUIRES_NEW,被catch后不抛出,事务可以正常提交;
如果被调用方法是Propagation.REQUIRED,被catch后不抛出,后面的代码虽然可以执行下去,但最终还是会分出rollback-only异常;
3、同一个Service中调用方法时:
不论注解是Propagation.REQUIRES_NEW 还是 Propagation.REQUIRED,
其结果都是一样的,就是都被忽略掉了,等于没写。
当其抛出异常时,只需catch住不抛出,事务就可以正常提交。
阅读全文
0 0
- Spring Transaction属性之Propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性之propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性之Propagation
- Spring Transaction属性 Propagation
- Spring @transaction注解propagation属性
- Spring transaction propagation
- Spring transaction propagation
- Spring Transaction propagation / readonly
- Spring Transaction propagation
- Spring Transaction属性之Isolation
- Spring 之注解事务 @Transactional propagation属性详解
- Spring: @Transactional中的propagation属性
- Spring: @Transactional中的propagation属性
- Android WebView重定向问题的解决方案
- GIT如何删除分支
- 命令行 更新Android sdk
- Linux安装MySQL
- 随机获取数Month.random 及在js中获取n位相互不重复的数据
- Spring Transaction属性之Propagation
- FileDisk源码分析
- 小米手机谈Toast
- 【第六届蓝桥杯】打印大X
- 代理模式之数据读写分离
- 图像处理之霍夫变换(直线检测算法)
- linux系统工具程序diff使用小结
- 如何打开tomcat的manager app?
- 遥控执行