zoukankan      html  css  js  c++  java
  • @Tranactional 注解分析

    Spring可以通过注解@Transactional来为业务逻辑层的方法(调用DAO完成持久化动作)添加事务能力,如下是@Transactional注解的定义

    @Tranactional注解分析

    • 作用域:Transactional作用于类上表示类上所有的方法使用指定的事务管理策略,作用于方法表示该方法使用指定的事务管理策略;如果方法和类同时定义了@Tranactional注解,那么方法上定义的@Tranactional的属性覆盖类上定义的@Tranactional的属性
    • value: 用于匹配Spring中定义的tranactionManager的名字,默认是Spring中名称为transactionManager的事务管理器。当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器
    • propagation:事务传播属性,默认是Propagation.REQUIRED。

      可选的值有:

      Propagation.REQUIRED

      如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

      Propagation.SUPPORTS

      如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。

      Propagation.MANDATORY

      如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

      Propagation.REQUIRES_NEW

      重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

      Propagation.NOT_SUPPORTED

      以非事务的方式运行,如果当前存在事务,暂停当前的事务。

      Propagation.NEVER

      以非事务的方式运行,如果当前存在事务,则抛出异常。

      Propagation.NESTED 和 Propagation.REQUIRED 效果一样。

    • isolation:事务隔离级别,默认是Isolation.DEFAULT,它是指数据库的默认隔离级别

      可选的值有:

      Isolation.DEFAULT

      使用底层数据库默认的隔离级别。

      Isolation.READ_UNCOMMITTED

      Isolation.READ_COMMITTED
      Isolation.REPEATABLE_READ
      Isolation.SERIALIZABLE

    • timeout:事务超时时间,默认是TransactionDefinition.TIMEOUT_DEFAULT,它是指数据库的默认的事务超时时间。默认值为-1,如果超过该时间限制但事务还没有完成,则自动回滚事务。

    参 数 名 称

    功 能 描 述

    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

    该属性用于设置事务的传播行为。

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

    isolation

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

    timeout

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

    注意:

    1. 一般情况下我们在处理具体的业务都是在Service层来进行处理操作,此时如果在Service类上添加@Transactional注解的话,那么Service曾的每一个业务方法调用的时候都会打开一个事务。

    2. Spring默认情况下会对(RuntimeException)及其子类来进行回滚,在遇见Exception及其子类的时候则不会进行回滚操作。

    3. @Transactional既可以作用于接口,接口方法上以及类已经类的方法上。但是Spring官方不建议接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。 Spring默认使用的是jdk自带的基于接口的代理,而没有使用基于类的代理CGLIB。

    4.  @Transactional注解底层使用的是动态代理来进行实现的,如果在调用本类中的方法,此时不添加@Transactional注解,而是在调用类中使用thisi调用本类中的另外一个添加了@Transactional注解,此时this调用的方法上的@Transactional注解是不起作用的。

     

    参考博客:https://blog.csdn.net/m0_37779570/article/details/81352587

                     https://www.jianshu.com/p/f80274bc6918

  • 相关阅读:
    LwIP源代码文件目录解析
    规划2014!
    test
    111
    df
    第一次北京之行
    Android02--debug.keystore的注册信息
    Android01--开发环境搭建
    dfd
    1007
  • 原文地址:https://www.cnblogs.com/ming-blogs/p/10751615.html
Copyright © 2011-2022 走看看