Spring事务回滚实战
一、前置知识
1、Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类
2、Exception分为运行时异常(RuntimeException及其子类)和非运行时异常(Exception子类中,除了RuntimeException及其子类之外的类)
3、使用spring的@Transactiona开启事务,默认Error和RuntimeException及其子类才会回滚
4、@Transactiona默认传播行为是REQUIRED,如需配合其他传播行为测试,请查看:Spring事务传播行为实战
二、情况分析
1、遇到异常可能回滚
1.1、Error和RuntimeException及其子类的异常,数据回滚
// 回滚
@Transactional
public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);throw new RuntimeException("运行报错啦");
}
1.2、非运行时异常,数据不回滚
// 不回滚
@Transactional
public void add() throws IOException {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);throw new IOException();
}
2、异常捕获
2.1、针对当前方法异常捕获
// 不回滚
@Transactional
public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);try {throw new RuntimeException("运行报错啦");} catch (RuntimeException e) {e.printStackTrace();}
}
2.2、针对跨方法异常捕获
针对跨方法捕获的异常,事务回滚,因为内部事务已经结束,确实是抛出了异常,经过AOP切面
@Transactional
public String insertForlanA(ForlanA forlanA) {try {forlanBService.insertForlanB(new ForlanB());} catch (Exception e) {e.printStackTrace();return "特定异常结果";}return "成功";
}@Transactional
public String insertForlanB(ForlanB forlanB) {forlanBDao.insert(forlanB);int res = 1 / 0; //java.lang.ArithmeticException: / by zeroreturn "成功";
}
3、指定异常进行回滚
3.1 RuntimeException及其子类异常
// 回滚
@Transactional(rollbackFor = NullPointerException.class)
public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);int forlan = 1 / 0;
}
这里抛出的是ArithmeticException,但我们指定是NullPointerException才回滚,为什么还是回滚了呢?
其实这两个类都是继承RuntimeException,Spring本来就默认了RuntimeException及其子类也是回滚的
3.2 非运行时异常
我们为什么还要指定rollbackFor参数?我们来看看下面的情况
// 回滚
@Transactional(rollbackFor = IOException.class)
public void add() throws IOException {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);throw new IOException();
}
我们从1.2得知,非运行时异常默认是不回滚,但我们可以通过指定rollbackFor参数来回滚
结论:是针对非运行时异常的,在原基础上拓展
4、指定异常不回滚
// 不回滚
@Transactional(noRollbackFor = ArithmeticException.class)
public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);int forlan = 1 / 0;
}
5、指定部分代码回滚
// ks_a表数据插入成功,ks_b数据回滚
@Transactional
public void add() {KsA ksA = new KsA();ksA.setName("林");ksAService.insert(ksA);Object savepoint = TransactionAspectSupport.currentTransactionStatus().createSavepoint();try {KsB ksB = new KsB();ksB.setAge(10);ksBService.insert(ksB);throw new RuntimeException("父方法报错");} catch (Exception e) {TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(savepoint);}
}
Spring事务回滚实战相关推荐
- Spring事务回滚和异常类
转载自 https://www.cnblogs.com/tianyuchen/p/6678084.html 1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和E ...
- 通过手动抛自定义异常实现spring事务回滚
通过手动抛自定义异常实现spring事务回滚 参考文章: (1)通过手动抛自定义异常实现spring事务回滚 (2)https://www.cnblogs.com/javalanger/p/10912 ...
- java 事务回滚注解_Java Spring 事务回滚详解
这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...
- spring事务回滚理解
1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...
- So easy Spring事务回滚机制
文章目录 事务控制的3种方式 伪代码 为什么不会滚呢 解决方案 声明式事务 注解事务 使用位置 基本用法 异常抛出 手动事务 设置回滚代码 设置回滚点 存储引擎 事务控制的3种方式 编程式事务:直接在 ...
- Spring 事务回滚实现原理
在Service层的方法上加上@Transactional注解,在发生错误时,方法会抛出运行时异常,随即Spring会自动回滚事务. Spring实现事务回滚的流程如下: 1.通过cglib,将方法上 ...
- Spring事务回滚失败
下面是一个回滚事务的案例 需求是:转账失败后 转账的事务会回滚,日志事务不会回滚 出现的问题是: 日志事务开启了@Transactional(propagation = Propagation.REQ ...
- Spring事务回滚典型场景
事务回滚场景 @Transactional注解默认事务传播级别为REQUIRED,默认回滚异常为RuntimeException 场景1 因为RuntimeException继承了Exception ...
- Spring中的事务回滚 网上比较不错的文章
1 浅谈Spring中的事务回滚 https://www.cnblogs.com/zeng1994/p/8257763.html 2 spring 事务回滚 https://www.cnblogs.c ...
最新文章
- WebApi发送HTML表单数据:文件上传与多部分MIME
- POJ3696-The Luckiest number【数论,欧拉定理】
- python入门实践19章_求助贴,python编程才能够入门到实践 第19章 19.2.2 代码出错
- h.264视频编码器
- android apk自动安装包下载,Android 下载Apk并安装
- 图解敏捷教练和 ScrumMaster
- vue中.lazy 相当于change事件
- 博学笃志,切问近思,此八字,是收放心的工夫。 神闲气静,智深勇沉,此八字,是干大事的本领...
- 等保十问|等保相关基本问题解答
- 数据库服务器到底是用机械硬盘还是固态硬盘
- 下载RoboWare Studio官网登录不上去
- GPU矩阵点积代码实现及分析
- 我和 JSRUN 网站的一些故事
- 【黄啊码】PHP压缩图片(简洁易懂版,不懂我下次不写)
- Google宣布收购摩托罗拉移动
- IDC评述网:12月上旬全球域名解析服务商Top15
- 器件 — ISOLATION AMPLIFIER — ISO124 Precision Lowest Cost ISOLATION AMPLIFIER
- 频谱分析仪和信号分析仪的区别方法
- swing java awt_java中AWT和SWing的区别与联系
- #include lt;NOIP2008 Juniorgt; 双栈排序 ——using namespace wxl;
热门文章
- 【垃圾回收器】基于Go实现引用计数法(ReferenceCount)
- 计算机系统层次模型,计算机取证的层次模型
- maya的颤动怎么做_maya基础动画实例:跳动的小球方案.ppt
- 手机存储android文件怎么打开,安卓手机如何打开.jio文件?
- vue项目打包部署nginx跨域
- python绘制词云图转换图_(数据科学学习手札71)利用Python绘制词云图
- Msu 系统补丁文件安装方法
- 三菱服务器绝对位置,三菱绝对位置原点设定
- Oracle Dataguard(主库为 Oracle rac 集群)配置教程(01)—— dataguard 服务器安装 Oracle 软件
- iOS UI入门——使用Objective-C和Swift实现UIImageView显示图片