• Spring注解@Transactional是什么?具体的使用方法


    本篇文章,我将和大家介绍 Spring 中的一个注解 @Transactional,将介绍一下 @Transactional的基本概念以及具体的使用方法。希望本篇文章能够对对大家的学习有所帮助!

    一、Transactional

    
    声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,
    然后在目标方法开始之前创建或者加入一个事务,
    在执行完目标方法之后根据执行情况提交或者回滚事务。
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    简而言之,@Transactional注解在代码执行出错的时候能够进行事务的回滚

    二、实战

    1、首先我在Mysql中准备了一条数据

    在这里插入图片描述

    2、开始测试@Transactional默认能回滚的异常

    1、我们的目的是需要把name修改为傻逼2

    在这里插入图片描述

    2、我们先来测试一下@Transactional 代码如下 大家都知道2/0必会抛出异常

    在这里插入图片描述

    3、执行测试 如图说明更新成功 别着急咱们继续断点往下面走

    在这里插入图片描述

    4、果然不出所料 执行到第21行的时候报错了 出现了java.lang.ArithmeticException: /by zero在这里插入图片描述

    5、细心的同学会发现ArithmeticException这个异常类是继承了RuntimeException

    -在这里插入图片描述

    6、这个时候我们去看一下数据库的值到底有没有修改成功 很显然数据是被回滚了 并没有修改成傻逼2

    在这里插入图片描述

    7、当我直接抛出RuntimeException异常时,数据库数据也是被回滚了 并没有修改成傻逼2

    在这里插入图片描述

    7、结论@Transactional默认回滚RuntimeException和RuntimeException下面的子类抛出的异常

    3、开始测试@Transactional默认不能回滚的异常

    1、代码如下

    在这里插入图片描述

    2、ok直接 抛出的异常是我们指定的java.lang.Exception异常 我们去看看数据库

    在这里插入图片描述

    3、数据库被更新成傻逼2了 说明@Transactional并不能回滚Exception异常

    在这里插入图片描述

    三、总结

    总结一下:@Transactional默认只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class)

    补充一下@Transactional一些失效的场景

    • 1、不是用public修饰

    • 2、try catch捕获了异常(没有在catch里面手动抛出异常)

    • 3、没有加@Service(也就是没有被 Spring 管理)

    • 4、数据库引擎不支持事务

    • 5、开启多线程任务时,事务管理会受到影响

    • 6、@Transactional 注解属性 rollbackFor 设置错误
      rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定rollbackFor属性。

  • 相关阅读:
    2023第十四届蓝桥杯国赛 C/C++ 大学 B 组 (赛后记录)
    热点key限流(3)
    Linxu-NAT123安装爬坑过程记录
    Tomcat 7.0 win7 64位免安装解压版 安装及配置
    【原创】java+swing+mysql宠物领养管理系统设计与实现
    第七讲 项目的收尾代码
    大促期间的窜货低价怎么处理
    阿里云ACP知识点(三)
    PyQt 问题记录
    【中间件安全知识学习 之 memcached】
  • 原文地址:https://blog.csdn.net/qq_42322632/article/details/124900967