Spring 事务传播行为
1. Spring 事务机制
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的开发支持。 Spring事务管理分为编程式和声明式两种。编程式事务指的事通过编码方式实现事务,声明式事务基于AOP将具体的逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染,因此实际开发中声明式事务使用的比较多。
声明式事务有两种实现方式:
- 在配置文件(XML)中做相关的事务规则声明
- 基于 @Transactional 注解的方式
2. @Transactional 注解属性介绍
@Transactional 是声明式事务管理编程中使用的注解,可以使用在类和方法上,@Transaction方法只有应用在public方法上有效,默认情况下Spring只会回滚运行时未受检查(继承自RunTimeExeception)的异常
2.1 isolation 属性
用来指定事务的隔离级别,默认值是 Isolation.DEFAULT,可选的值有:
- Isolation.DEFAULT:使用底层数据库默认的隔离级别
- Isolation.READ_UNCOMMITED:读未提交(可能会出现脏读幻读不可重复读)基本不使用
- Isolation.READ_COMMITED: 读已提交(会出现不可重复读和幻读)
- Isolation.REPEATABLE_READ: 可重复读(会出现幻读)
- Isolation.SERIALIZABLE: 串行化
2.2 timeout 属性
用来指定事务的超时时间,默认值为-1永不超时,可以根据业务指定具体的超时时间,事务超时会自动回滚。
2.3 rollbackFor 属性
用来指定触发事务回滚的异常类型,可以指定多个异常类型。
2.4 noRollbackFor 属性
用来抛出指定的异常类型,不会回滚事务,可以指定多个异常类型。
2.5 readOnly 属性
用来指定事务是否为只读事务,默认值为 false。为了忽略一些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
2.6 propagation 属性
用来指定事务的传播行为,默认值为Propagation.REQUIRED。 可选值有:
| 传播属性 | 当前不存在事务 | 当前存在事务 |
|---|---|---|
| REQUIRED | 新建事务 | 加入当前事务 |
| REQUIRED_NEW | 新建事务 | 挂起当前事务,新建事务 |
| SUPPORTS | 不使用事务 | 加入当前事务 |
| NOT_SUPPORTS | 不使用事务 | 挂起当前事务 |
| MANDATORY | 抛出异常 | 加入当前事务 |
| NEVER | 不使用事务 | 抛出异常 |
| NESTED | 新建事务 | 嵌套事务 |
3. 事务传播行为
当事务方法被另一个事务方法调用时,我们必须指定事务应该如何传播
@Transactional
public void methodA() {
methodB();
}
@Transactional
public void methodB() {
......
}
事务的传播行为是站在被调用方法的角度上去说的,就是示例中的方法B 对7种传播行为的演示和总结以及源码角度分析下次再更新。。。