点击上方“芋道源码”,选择“设为星标”
管她前浪,还是后浪?
能浪的浪,才是好浪!
每天 10:33 更新文章,每天掉亿点点头发...
源码精品专栏
- 原创 | Java 2021 超神之路,很肝~
- 中文详细注释的开源项目
- RPC 框架 Dubbo 源码解析
- 网络应用框架 Netty 源码解析
- 消息中间件 RocketMQ 源码解析
- 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析
- 作业调度中间件 Elastic-Job 源码解析
- 分布式事务中间件 TCC-Transaction 源码解析
- Eureka 和 Hystrix 源码解析
- Java 并发源码
来源:blog.csdn.net/weixin_42169734/
article/details/117122084
- 1、首先我在Mysql中准备了一条数据
- 2、简单粗暴的开始测试了
- 总结一下
1、首先我在Mysql中准备了一条数据
基于 Spring Boot MyBatis Plus Vue & Element 实现的后台管理系统 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://gitee.com/zhijiantianya/ruoyi-vue-pro
- 视频教程:https://doc.iocoder.cn/video/
2、简单粗暴的开始测试了
1、我们的目的是需要把delflag修改为0 简单的准备一下sql
代码语言:javascript复制 <update id="test">
UPDATE tbl_users set delflag='0' where account='admin'
</update>
2、我们先来测试一下@Transactional
代码如下 大家都知道2/0必会抛出异常
@Override
@Transactional
public Ret test(){
int i = articleMapper.test();
int a = 2/0;
if(i > 0){
ResultUtil.success();
}
return ResultUtil.error();
}
3、执行测试 i=1说明更新成功 别着急咱们继续断点往下面走
4、果然不出所料 执行到第54行的时候报错了 出现了java.lang.ArithmeticException: /by zero
5、细心的同学会发现ArithmeticException
这个异常类是继承了RuntimeException
的
而@Transactional
默认回滚的的异常就是RuntimeException
6、我们在点进去RuntimeException
这个类里面一探究竟 我们发现RuntimeException
又是继承Exception
的
而所有的异常类基本都是继承RuntimeException
包括刚才上面的java.lang.ArithmeticException
异常
所以只要是RuntimeException
和RuntimeException
下面的子类抛出的异常 @Transactional
都可以回滚的
7、这个时候我们去看一下数据库的值到底有没有修改成功 很显然数据是被回滚了 并没有修改成0
1、下面我们在试试@Transactional
不能过滚的异常 代码如下
我们直接先用try catch
来捕获异常 然后在catch里面自定义抛出Exception
异常
@Override
@Transactional
public Ret test() throws Exception {
int i = articleMapper.test();
try {
int a = 2 / 0;
} catch (Exception e) {
throw new Exception();
}
if (i > 0) {
ResultUtil.success();
}
return ResultUtil.error();
}
2、ok直接 抛出的异常是我们指定的java.lang.Exception
异常 我们去看看数据库
3、数据库被更新成0了 说明@Transactional
并不能回滚Exception异常
基于 Spring Cloud Alibaba Gateway Nacos RocketMQ Vue & Element 实现的后台管理系统 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://gitee.com/zhijiantianya/yudao-cloud
- 视频教程:https://doc.iocoder.cn/video/
总结一下
@Transactional
只能回滚RuntimeException
和RuntimeException
下面的子类抛出的异常 不能回滚Exception
异常
如果需要支持回滚Exception
异常请用@Transactional(rollbackFor = Exception.class)
这里如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)
补充一下@Transactional(rollbackFor = Exception.class)
一些失效的场景:
1、不是用public修饰
2、try catch捕获了异常(没有在catch里面手动抛出异常)
3、没有加@Service(也就是没有被 Spring 管理)
欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:
已在知识星球更新源码解析如下:
最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。
提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
代码语言:javascript复制文章有帮助的话,在看,转发吧。谢谢支持哟 (*^__^*)