美文网首页
Spring的事务传播行为

Spring的事务传播行为

作者: 求心丶 | 来源:发表于2021-02-21 00:00 被阅读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);
    }
    

    相关文章

      网友评论

          本文标题:Spring的事务传播行为

          本文链接:https://www.haomeiwen.com/subject/mhhffltx.html