• @transactional注解在什么情况下会失效,为什么?


    一,特性:

    1,一般在service里加@Transactional注解,不建议在接口上添加,加了此注解后此类会纳入spring事务管理中,每个业务方法执行时,都会开启一个事务,不过都是按照相同的管理机制。
    2,@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。
    3,默认情况下此注解会对unchecked异常进行回滚,对checked异常不回滚。

    那什么是unchecked,什么是checked呢?

    通俗的说,编译器能检测到的是checked,检测不到的就是unchecked。
    派生于Error或者RuntimeException(比如空指针,1/0)的异常称为unchecked异常。
    继承自Exception得异常统称为checked异常,如IOException、TimeoutException等。
    4、只读事务:
    @Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
    只读标志只在事务启动时应用,否则即使配置也会被忽略。
    启动事务会增加线程开销,数据库因共享读取而锁定(具体跟数据库类型和事务隔离级别有关)。通常情况下,仅是读取数据时,不必设置只读事务而增加额外的系统开销。

    PROPAGATION_REQUIRED:如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。
    PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
    PROPAGATION_MANDATORY:使用当前的事务,如果当前没有事务,就抛出异常。
    PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
    PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
    PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
    PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

    三,解决注解不回滚问题

    1,检查方法是不是public
    2,检查异常是不是unchecked异常
    3,如果是checked异常也想回滚的话,注解上写明异常类型即可
    @Transactional(rollbackFor=Exception.class)

  • 相关阅读:
    Java 中的 TreeSet
    自定义全局异常处理器(Java)
    GitHub Open Feign 使用总结
    搭建 Maven 仓库
    MySQL 的 SQL 笔记
    一道算法题:查找数组 arr 中第 k 小的奇数
    Java 的参数传递
    接口限流的几种算法
    Java 实现一个自定义分布式 Session
    函数反汇编
  • 原文地址:https://www.cnblogs.com/eryun/p/12017262.html
Copyright © 2020-2023  润新知