栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

简而言之,@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属性。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/921476.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号