zoukankan      html  css  js  c++  java
  • spring事务注解配置解析

    在之前简单介绍了spring事务的用法,在spring中,事务的传播属性和隔离级别比较多,因此抽出来,单独写一篇来解释

    注意:@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。

    为了方便使用,直接使用注解配置spring事务,Ctrl+单击

    打开注解,我们可以看到这个注解内的方法属性,

    下面我们来解释常用几个属性的取值:

    package com.zs.service;
    
    import java.lang.annotation.Documented;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Inherited;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    import org.springframework.core.annotation.AliasFor;
    import org.springframework.transaction.annotation.Isolation;
    import org.springframework.transaction.annotation.Propagation;
    
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Transactional {
        @AliasFor("transactionManager")
        String value() default "";
    
        @AliasFor("value")
        String transactionManager() default "";
    
        /**
         * 事务传播特性:
         * Propagation.REQUIRED     判断当前方法是否存在事务,如果不存在就创建一个新的事务,如果存在就使用当前的事务
         * Propagation.REQUIRES_NEW 判断当前方法是否存在事务,如果不存在事务就创建一个新的事务,
         *                             如果存在事务,就把当前事务挂起,在启动一个新的事务
         * Propagation.NESTED       嵌套事务。判断当前方法是否存在事务,如果不存在就创建一个事务,如果存在事务就把当前事务挂起,
         *                              再启动一个当前事务的子事务,这样如果父事务产生异常,那么即使子事务没有异常也会回滚。
         * Propagation.NEVER        当前方法不应该运行在事物中,如果有事务就抛出异常;
         * Propagation.NOT_SUPPORTED当前方法不应该有事务,如果有事务存在,将它挂起,以无事务状态运行
         * Propagation.MANDATORY    当前方法必须要在有事务方法中运行,不然就抛出异常;如果有事务,就加入当前事务。
         * Propagation.SUPPORTS     支持事务,如果有事务,就加入事务中,如果没有事务,就以无事物的方式运行;
         * @return
         */
        Propagation propagation() default Propagation.REQUIRED;
    
        /**
         * 设置隔离级别
         * Isolation.DEFAULT            底层数据存储的默认隔离级别,sqlServer与oracle默认为已提交读
         * Isolation.READ_COMMITTED     已提交读    读取已提交数据(会出现不可重复读和幻读)
         * Isolation.READ_UNCOMMITTED   未提交读    读取未提交数据(会出现脏读, 不可重复读) 基本不使用;
         * Isolation.REPEATABLE_READ    可重复读    可重复读(会出现幻读);在一个事务中进行查询时,
         *                                          不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据
         * Isolation.SERIALIZABLE       序列化
         * @return
         */
        Isolation isolation() default Isolation.SERIALIZABLE;
    
        /**
         * 该属性用于设置事务的超时秒数,默认值为-1表示永不超时
         * @return
         */
        int timeout() default -1;
    
        /**
         * 设置当前事务是否为只读事务,设置为true表示只读,false表示可读写,默认为false,
         * 如果当前事务为查询操作,可以设置为true,可以提高程序运行效率
         * @return
         */
        boolean readOnly() default false;
    
        /**
         * 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。
         * 如:@Transactional(rollbackFor = {NullPointerException.class,RuntimeException.class})
         * 表示空指针异常和运行时异常时回滚事务
         * @return
         */
        Class<? extends Throwable>[] rollbackFor() default {};
    
        /**
         * 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。
         * 与上面的区别就是,直接写异常名字,不需要写.class
         * 如:@Transactional(rollbackForClassName = {"NullPointerException","Exception"})
         * @return
         */
        String[] rollbackForClassName() default {};
    
        /**
         * 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。
         * 如:@Transactional(noRollbackFor = {NullPointerException.class})
         * 表示当抛出空指针异常时,不回滚事务
         * @return
         */
        Class<? extends Throwable>[] noRollbackFor() default {};
    
        /**
         * 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。
         * 如:@Transactional(noRollbackForClassName = {"NullPointerException","Exception"})
         * 很容易发现,与上面的两组是相对的,上面的是发生指定异常回滚,下面的是发生指定异常不回滚
         * @return
         */
        String[] noRollbackForClassName() default {};
    }
  • 相关阅读:
    MongoDB学习笔记(五) MongoDB文件存取操作(转)
    MongoDB学习笔记(四) 用MongoDB的文档结构描述数据关系(转)
    Log4net配置相关
    UML 依赖 关联 聚合 组合
    亲属称谓
    Unity预定义程序集及自定义包编译顺序
    For Windows Phone8 phones make sure that the Windows Phone IP Over USB Transport(IpOverUsbSvc) service is running
    提升Entityframework效率的几种方法
    将RDLC报表工具栏中的英文改为中文
    C#函数式程序设计初探——基础理论篇
  • 原文地址:https://www.cnblogs.com/Zs-book1/p/11305598.html
Copyright © 2011-2022 走看看