Spring 事务传播行为

260 阅读2分钟

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种传播行为的演示和总结以及源码角度分析下次再更新。。。