文章目录

  • 事务控制的3种方式
  • 伪代码
  • 为什么不会滚呢
  • 解决方案
    • 声明式事务
    • 注解事务
      • 使用位置
      • 基本用法
      • 异常抛出
    • 手动事务
      • 设置回滚代码
      • 设置回滚点
    • 存储引擎

事务控制的3种方式

  1. 编程式事务:直接在代码里手动开启事务,手动提交,手动回滚。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了
  2. 声明式事务:就是使用Spring Aop配置事务,这种方式简化了编码。需要注意的是切入点表达式一定要写正确。
  3. 注解事务:直接在Service层的方法上面加上@Transactional注解,最简单方便的方式。

伪代码

排序往后的方法报错,导致排序前的方法不回滚,如下:updataFlag方法出错,analyseRedBallanalyseBlueBall 方法不会回滚

    public void statistics() {// 三个子方法中有操作数据库方法analyseRedBall(periods, redBalls);analyseBlueBall(periods, blueBalls);updataFlag(periods);}

为什么不会滚呢

Spring默认情况下是捕获到方法的RuntimeException异常,也就是说只要属于RuntimeException异常或及其子类都能回滚。不属于运行时异常时,事务不回滚的。

解决方案

声明式事务

确保切入点表达式书写正确,如在配置里面添加rollback-for

<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

注解事务

使用位置

  1. 类上:该类的所有 public 方法将都具有务属性
  2. 方法上:只能应用到 public 方法上,这是由Spring AOP的本质决定的,如果在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,将被忽略,也不会抛出任何异常。
  3. 接口、接口方法上:接口实现类或接口实现方法可继承事务属性,Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效

基本用法

将Spring默认的RuntimeException异常修改为Exception异常,可以保证任何异常都可以回滚。

@Transactional(rollbackFor = Exception.class)

或指定多个异常

@Transactional(rollbackFor = {Exception.class, RuntimeException.class})

如上述实例修改为

    @Transactional(rollbackFor = Exception.class)public void statistics() {// 在statistics 父方法上使用事务注解,即可保证发生异常后,三个子方法事务全部回滚(子方法上不再需要写上事务注解@Transactional)analyseRedBall(periods, redBalls);analyseBlueBall(periods, blueBalls);updataFlag(periods);}

异常抛出

在catch语句中抛出异常,以便让Aop捕获异常执行回滚事务,如下伪代码

    @Transactional(rollbackFor = Exception.class)public void statistics() {analyseRedBall(periods, redBalls);analyseBlueBall(periods, blueBalls);updataFlag(periods);}public void analyseRedBall(List<Period> periods, List<RedBall> redBalls) {try {// ...逻辑代码} catch (Exception e) {throw new RuntimeException();}}

手动事务

配合事务注解@Transactional,手动处理事务回滚

设置回滚代码

catch语句中设置回滚代码来实现回滚,此方法在抛出异常后也能return 返回值,适合需要拿到返回值的场景

    @Transactional(rollbackFor = Exception.class)public boolean statistics() {try {analyseRedBall(periods, redBalls);analyseBlueBall(periods, blueBalls);updataFlag(periods);} catch (Exception e) {// 加上此句,则不再需要手动抛出指定异常TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); return fales; }return true;}

设置回滚点

// 方法返回的是object类型,o 为回滚点变量名
Object o = TransactionAspectSupport.currentTransactionStatus().createSavepoint();
// ...逻辑代码
TransactionAspectSupport.currentTransactionStatus().rollbackToSavepoint(o);

存储引擎

到此之前,代码无误,那为什么 Spring 或 SpringBoot 的事务回滚还是没有任何效果呢?

数据库肯定是MySQL ,那表的存储引擎,也要支持事务安全才行,最重要,也是最多人忽视的地方

InnoDB 和 BDB 提供事务安全表,其他存储引擎都是非事务安全表

注:Oracleb不存在存储引擎的概念,数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。

  • OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作
  • OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等

So easy Spring事务回滚机制相关推荐

  1. Spring事务回滚和异常类

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

  2. seata分布式事务回滚机制是如何实现的

    本文来说下seata分布式事务回滚机制是如何实现的 文章目录 概述 概述

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

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

  4. Mysql事务回滚机制与原理

    Mysql事务回滚机制与原理 文章目录 Mysql事务回滚机制与原理 一.事务回滚机制 二.使用到的技术讨论 三.redo log和undo log介绍 3.1 redo log 3.2 undo l ...

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

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

  6. Spring事务回滚实战

    一.前置知识 1.Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类 2.Exception分为运行时异常(RuntimeException及其子类)和非运行时 ...

  7. redis事务及类事务回滚机制

    目录 前言 一.redis事务 二.通过redis-cli体验redis事务相关命令 1.开启事务 2.放弃事务 3.redis事务中的命令正确而数据类型错误.命令错误时的执行情况 (1).第一种情况 ...

  8. spring事务回滚理解

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

  9. Spring事务回滚失败

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

最新文章

  1. 笔试题——max pooling滑动窗口实现(python 代码)
  2. 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
  3. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
  4. Java根据文件头文件信息判断文件类型
  5. python redis订阅_Python -- Redis 发布订阅
  6. java mvc增删改查_springmvc-CRUC增删改查
  7. 互联网架构的演变,看了好多这个讲的确实清楚!
  8. 录音喊话器的故障修理_我司quot;XAHHQ1型quot;喊话器 通过公安部检测
  9. spring事务和mysql的隔离级别
  10. matlab mxarray赋值,C++中数组与MATLAB mxArray相互赋值
  11. 页面发送请求到后台报错“Empty or invalid anti forgery header token.”问题解决
  12. 周剑:国产商业智能 BI 这 20 年(1997~2017)
  13. OpenCV摄像头标定
  14. defined 用法
  15. linux常用网站(不定期更新)
  16. 老程序员教你如何提高开发效率、成为大神1——人文思维进化与信众
  17. Debian11安装mysql5.7
  18. Windows 8.1新型启动方式“WIMBoot”基础简介以及初步探索
  19. Java基础汇总(十四)——LinkedList,Queue
  20. 高效办公的Excel小技巧

热门文章

  1. luo3372线段树模板的分块做法
  2. 一个和二维泊松求和有关的公式(推导Ewald级数中有用,运用了2D泊松求和公式,傅里叶变换的位移性质)
  3. java开发工程师初级证,成长路线图
  4. mysql yearweek 函数周日当做一周开始
  5. misc-扫扫出奇迹光阴似箭杰斯的魔法
  6. java计算机毕业设计图书借阅系统的设计与实现源码+系统+数据库+lw文档
  7. get 请求参数是对象怎么办
  8. 多旋翼无人机简易改装1——起落架自制可水面起降
  9. Win10 蓝牙连接2个天猫精灵X5双音频输出
  10. Word Reciter 1.0.0 日语背单词软件