zoukankan      html  css  js  c++  java
  • Spring中的@Transactional事务注解

      事务注解方式  @Transactional

      当标于类前时, 标示类中所有方法都进行事物处理 , 例子:  

    @Transactional 
    public class TestServiceBean implements TestService {}
    

      当类中某些方法不需要事务时:

    @Transactional  
    public class TestServiceBean implements TestService { 
        private TestDao dao; 
        public void setDao(TestDao dao) { 
            this.dao = dao; 
        } 
        @Transactional(propagation =Propagation.NOT_SUPPORTED)
        public List getAll() { 
            return null; 
        } 
    }
    

      1.事务传播行为

       @Transactional(propagation=Propagation.REQUIRED) :如果有事务, 那么加入事务, 没有的话新建一个(默认情况下)
      @Transactional(propagation=Propagation.NOT_SUPPORTED) :容器不为这个方法开启事务
      @Transactional(propagation=Propagation.REQUIRES_NEW) :不管是否存在事务,都创建一个新的事务,原来的挂起,新的执行完毕,继续执行老的事务
      @Transactional(propagation=Propagation.MANDATORY) :必须在一个已有的事务中执行,否则抛出异常[mandatory,强制的]
      @Transactional(propagation=Propagation.NEVER) :必须在一个没有的事务中执行,否则抛出异常(与Propagation.MANDATORY相反)
      @Transactional(propagation=Propagation.SUPPORTS) :如果其他bean调用这个方法,在其他bean中声明事务,那就用事务.如果其他bean没有声明事务,那就不用事务
    

      2.事务超时设置

    @Transactional(timeout=30) //默认是30秒
    

      3.事务隔离级别

       @Transactional(isolation = Isolation.READ_UNCOMMITTED):读取未提交数据(会出现脏读, 不可重复读) 基本不使用
      @Transactional(isolation = Isolation.READ_COMMITTED):读取已提交数据(会出现不可重复读和幻读)
      @Transactional(isolation = Isolation.REPEATABLE_READ):可重复读(会出现幻读)
      @Transactional(isolation = Isolation.SERIALIZABLE):串行化
      MYSQL: 引擎默认为innoDB,innoDB的事务隔离级别默认为REPEATABLE_READ级别
      SQLSERVER: 默认为READ_COMMITTED
    脏读 : 一个事务读取到另一事务未提交的更新数据;
    不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"是在同一事务中多次读取数据时, 
          能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据; 幻读 : 一个事务读到另一个事务已提交的insert数据。

      @Transactional注解中常用参数说明:

    参数名称

    功能描述

    readOnly

    该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

    rollbackFor

    该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

    指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

    指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

    rollbackForClassName

    该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

    指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

    指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

    noRollbackFor

    该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

    指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

    指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

    noRollbackForClassName

    该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

    指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

    指定多个异常类名称:

    @Transactional(noRollbackForClassName={"RuntimeException","Exception"})

    propagation

    该属性用于设置事务的传播行为,具体取值可参考表6-7。

    例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

    isolation

    该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

    timeout

    该属性用于设置事务的超时秒数,默认值为-1表示永不超时

      注意:

      1.@Transactional 注解应该只被应用到 public 可见度的方法上。 如果在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

      2.Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。

      关于注解的继承情况,在父类的类上和方法上有自定义的注解,子类继承这个父类时的注解继承情况是:

      在编写自定义注解时,可以通过指定@Inherited注解,指明自定义注解是否可以被继承。通过测试结果来看,@Inherited 只是可以控制对类名上的注解是否可以被继承,但是不能控制方法上的注解是否可以被继承。

  • 相关阅读:
    mysql 中将汉字(中文)按照拼音首字母排序
    数据库连接客户端 dbeaver 程序包以及使用说明
    maven 项目在 tomcat 中启动报错:Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
    iPadOS 更新日志
    iOS 更新日志
    mybatis 中 if else 用法
    Chrome 地址栏如何设置显示 http/https 和 www
    Windows 常用工具 & 开发工具 & Chrome插件 & Firefox 插件 & 办公软件
    elasticsearch安装ik分词器
    js关闭浏览器
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8808786.html
Copyright © 2011-2022 走看看