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 {};
}

这里有两个枚举类IsolationPropagation需要重点关注

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);
}
上一篇下一篇

猜你喜欢

热点阅读