Spring的事务传播行为
2021-02-21 本文已影响0人
求心丶
前言
Spring同时支持编程事务策略和声明式事务策略,通常都推荐采用声明式事务策略。使用声明式事务策略的优势十分明显。
1.声明式事务能大大降低开发者的代码书写量,通过在类或方法上使用注解@Transactional即可获得事务支持(注意事务失效的情况),不与业务代码耦合。
2.由于Spring采用AOP的方式管理事务,因此,可以在事务回滚动作中插入用户自己的动作,而不仅仅是执行系统默认的回滚。
@Transactional
@Transactional注解为Spring提供声明式事务支持,此注解定义如下:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
//事务管理器
@AliasFor("transactionManager")
String value() default "";
//事务管理器
@AliasFor("value")
String transactionManager() default "";
//事务传播行为,默认是REQUIRED
Propagation propagation() default Propagation.REQUIRED;
//事务隔离级别
Isolation isolation() default Isolation.DEFAULT;
//事务超时时间,注意只有使用JdbcTemplate实现Dao时此属性才能生效,使用Mybatis实现无法生效
int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;
//是否只读
boolean readOnly() default false;
//需要进行回滚的异常类型
Class<? extends Throwable>[] rollbackFor() default {};
//需要进行回滚的异常类名
String[] rollbackForClassName() default {};
//不需要进行回滚的异常类型
Class<? extends Throwable>[] noRollbackFor() default {};
//不需要进行回滚的异常类名
String[] noRollbackForClassName() default {};
}
这里有两个枚举类Isolation
, Propagation
需要重点关注
Isolation
Isolation表示事务的隔离级别,此枚举类定义如下:
public enum Isolation {
//使用数据库默认的事务隔离级别
DEFAULT(TransactionDefinition.ISOLATION_DEFAULT),
//未提交读,会发生脏读、不可重复读以及幻读
READ_UNCOMMITTED(TransactionDefinition.ISOLATION_READ_UNCOMMITTED),
//提交读,会发生不可重复读和幻读
READ_COMMITTED(TransactionDefinition.ISOLATION_READ_COMMITTED),
//可重复读,会发生幻读
REPEATABLE_READ(TransactionDefinition.ISOLATION_REPEATABLE_READ),
//串行,可避免脏读、不可重复读以及幻读
SERIALIZABLE(TransactionDefinition.ISOLATION_SERIALIZABLE);
private final int value;
Isolation(int value) {
this.value = value;
}
public int value() {
return this.value;
}
}
Propagation
Propagation表示事务的传播行为,此枚举类定义如下:
public enum Propagation {
//默认的事务传播行为,支持当前事务,如果当前不存在事务则创建一个新的事务
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED),
//支持当前事务,如果当前不存在事务则以非事务形式执行
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS),
//必须以事务形式执行,支持当前事务,如果当前不存在事务则抛出异常
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY),
//创建新的事务,如果当前已存在事务则先将当前事务挂起
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
//以非事务形式执行,如果当前已存在事务则将当前事务挂起
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED),
//不支持事务,如果当前存在事务则抛出异常
NEVER(TransactionDefinition.PROPAGATION_NEVER),
//如果当前存在一个事务,则该方法会在嵌套事务中执行,嵌套的事务可以独立的进行提交或回滚,
//如果当前不存在事务,则创建一个新事物,此时其行为与PROPAGATION_REQUIRED相同
NESTED(TransactionDefinition.PROPAGATION_NESTED);
}