一、前置知识

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事务回滚实战相关推荐

  1. Spring事务回滚和异常类

    转载自 https://www.cnblogs.com/tianyuchen/p/6678084.html 1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和E ...

  2. 通过手动抛自定义异常实现spring事务回滚

    通过手动抛自定义异常实现spring事务回滚 参考文章: (1)通过手动抛自定义异常实现spring事务回滚 (2)https://www.cnblogs.com/javalanger/p/10912 ...

  3. java 事务回滚注解_Java Spring 事务回滚详解

    这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...

  4. spring事务回滚理解

    1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...

  5. So easy Spring事务回滚机制

    文章目录 事务控制的3种方式 伪代码 为什么不会滚呢 解决方案 声明式事务 注解事务 使用位置 基本用法 异常抛出 手动事务 设置回滚代码 设置回滚点 存储引擎 事务控制的3种方式 编程式事务:直接在 ...

  6. Spring 事务回滚实现原理

    在Service层的方法上加上@Transactional注解,在发生错误时,方法会抛出运行时异常,随即Spring会自动回滚事务. Spring实现事务回滚的流程如下: 1.通过cglib,将方法上 ...

  7. Spring事务回滚失败

    下面是一个回滚事务的案例 需求是:转账失败后 转账的事务会回滚,日志事务不会回滚 出现的问题是: 日志事务开启了@Transactional(propagation = Propagation.REQ ...

  8. Spring事务回滚典型场景

    事务回滚场景 @Transactional注解默认事务传播级别为REQUIRED,默认回滚异常为RuntimeException 场景1 因为RuntimeException继承了Exception ...

  9. Spring中的事务回滚 网上比较不错的文章

    1 浅谈Spring中的事务回滚 https://www.cnblogs.com/zeng1994/p/8257763.html 2 spring 事务回滚 https://www.cnblogs.c ...

最新文章

  1. WebApi发送HTML表单数据:文件上传与多部分MIME
  2. POJ3696-The Luckiest number【数论,欧拉定理】
  3. python入门实践19章_求助贴,python编程才能够入门到实践 第19章 19.2.2 代码出错
  4. h.264视频编码器
  5. android apk自动安装包下载,Android 下载Apk并安装
  6. 图解敏捷教练和 ScrumMaster
  7. vue中.lazy 相当于change事件
  8. 博学笃志,切问近思,此八字,是收放心的工夫。 神闲气静,智深勇沉,此八字,是干大事的本领...
  9. 等保十问|等保相关基本问题解答
  10. 数据库服务器到底是用机械硬盘还是固态硬盘
  11. 下载RoboWare Studio官网登录不上去
  12. GPU矩阵点积代码实现及分析
  13. 我和 JSRUN 网站的一些故事
  14. 【黄啊码】PHP压缩图片(简洁易懂版,不懂我下次不写)
  15. Google宣布收购摩托罗拉移动
  16. IDC评述网:12月上旬全球域名解析服务商Top15
  17. 器件 — ISOLATION AMPLIFIER — ISO124 Precision Lowest Cost ISOLATION AMPLIFIER
  18. 频谱分析仪和信号分析仪的区别方法
  19. swing java awt_java中AWT和SWing的区别与联系
  20. #include lt;NOIP2008 Juniorgt; 双栈排序 ——using namespace wxl;

热门文章

  1. 【垃圾回收器】基于Go实现引用计数法(ReferenceCount)
  2. 计算机系统层次模型,计算机取证的层次模型
  3. maya的颤动怎么做_maya基础动画实例:跳动的小球方案.ppt
  4. 手机存储android文件怎么打开,安卓手机如何打开.jio文件?
  5. vue项目打包部署nginx跨域
  6. python绘制词云图转换图_(数据科学学习手札71)利用Python绘制词云图
  7. Msu 系统补丁文件安装方法
  8. 三菱服务器绝对位置,三菱绝对位置原点设定
  9. Oracle Dataguard(主库为 Oracle rac 集群)配置教程(01)—— dataguard 服务器安装 Oracle 软件
  10. iOS UI入门——使用Objective-C和Swift实现UIImageView显示图片