spring的事务传播机制 @Transational注解
spring的事务传播机制:多个事务方法相互调用时,事务如何在这些方法中传播。
分为三种:
1.1支持当前事务:
REQUIRED(必须有):如果当前方法没有事务,新建一个事务,如果已经存在事务,则加入这个事务。
SUPPORTS(可有可无):支持当前事务,如果当前没有事务,就以非事务方式执行。
MANDATORY(强制):使用当前事务,如果当前没有事务,就抛出异常。
1.2不支持当前事务
REQUIRES_NEW:新建事务,如果当前存在事务则当前事务挂起。
NOT_SUPPORTED: 以非事务的方式运行,如果当前存在事务,则把当前事务挂起。
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
1.3NESTED:如果当前存在事务,则嵌套在事务内执行(会和上层事务一起提交),如果当前不存在事务则,和REQUIRED操作类似。
@Transactional() @Override public void requiredTest() { /* User userupdate=new User(); userupdate.setId(2); userupdate.setName("required"); userDao.update(userupdate);*/
// otherService.requiredTest();//有事务加入当前事务没有就自己创建一个新的事务
// otherService.requiredNewTest(); //不加入当前事务,会执行自己的修改
// otherService.sopportsTest();//有事务就会加入到当前事务 回滚
otherService.notSopportsTest();//不加入当前事务 自己执行 里层的异常会影响外层的提交
// otherService.mandatoryTest();//当前的方法必须在事务中运行,否则的话就抛出异常。
// otherService.nestedTest();// 嵌套开启一个新事务 受外层事务影响 外层有异常也不会提交
// otherService.neverTest();//以非事务的方式运行,如果当前存在事务,则抛出异常
int i=10/0;//抛异常
}
事务失效的情况:
1.注解应用在非public方法上
2.propagation配置错误 PROPAGATION_SUPPORTS ;PROPAGATION_NOT_SUPPORTED; PROPAGATION_NEVER
3.@Transactional 注解属性 rollbackFor 设置错误(默认值捕获runtimexception和error )
4、同一个类中方法调用,导致@Transactional失效 因为事务生效必须要是代理类调用才可以 本类相当于调用的被代理类了。
5、异常被你的 catch“吃了”导致@Transactional失效
6、数据库引擎不支持事务 innodb支持事务 myisam不支持事务