So easy Spring事务回滚机制
文章目录
- 事务控制的3种方式
- 伪代码
- 为什么不会滚呢
- 解决方案
- 声明式事务
- 注解事务
- 使用位置
- 基本用法
- 异常抛出
- 手动事务
- 设置回滚代码
- 设置回滚点
- 存储引擎
事务控制的3种方式
编程式事务
:直接在代码里手动开启事务,手动提交,手动回滚
。优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了
。声明式事务
:就是使用Spring Aop配置事务
,这种方式简化了编码。需要注意的是切入点表达式一定要写正确。注解事务
:直接在Service层的方法上面加上@Transactional注解
,最简单方便的方式。
伪代码
排序往后的方法报错,导致排序前的方法不回滚
,如下:updataFlag
方法出错,analyseRedBall
和 analyseBlueBall
方法不会回滚
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"/>
注解事务
使用位置
类上
:该类的所有public 方法
将都具有务属性方法上
:只能应用到 public 方法上,这是由Spring AOP的本质决定的,如果在protected、private
或者默认可见性的方法上
使用 @Transactional 注解,将被忽略,也不会抛出任何异常。接口、接口方法上
:接口实现类或接口实现方法可继承事务属性,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事务回滚机制相关推荐
- Spring事务回滚和异常类
转载自 https://www.cnblogs.com/tianyuchen/p/6678084.html 1.异常的一些基本知识 异常的架构 异常的继承结构:Throwable为基类,Error和E ...
- seata分布式事务回滚机制是如何实现的
本文来说下seata分布式事务回滚机制是如何实现的 文章目录 概述 概述
- 通过手动抛自定义异常实现spring事务回滚
通过手动抛自定义异常实现spring事务回滚 参考文章: (1)通过手动抛自定义异常实现spring事务回滚 (2)https://www.cnblogs.com/javalanger/p/10912 ...
- Mysql事务回滚机制与原理
Mysql事务回滚机制与原理 文章目录 Mysql事务回滚机制与原理 一.事务回滚机制 二.使用到的技术讨论 三.redo log和undo log介绍 3.1 redo log 3.2 undo l ...
- java 事务回滚注解_Java Spring 事务回滚详解
这篇文章主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下 spring 事务回滚 1.遇到的问题 当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误.伪代 ...
- Spring事务回滚实战
一.前置知识 1.Java异常中,Throwable是最顶层的父类,有Error和Exception两个子类 2.Exception分为运行时异常(RuntimeException及其子类)和非运行时 ...
- redis事务及类事务回滚机制
目录 前言 一.redis事务 二.通过redis-cli体验redis事务相关命令 1.开启事务 2.放弃事务 3.redis事务中的命令正确而数据类型错误.命令错误时的执行情况 (1).第一种情况 ...
- spring事务回滚理解
1.代码中事务控制的3种方式 编程式事务:就是直接在代码里手动开启事务,手动提交,手动回滚.优点就是可以灵活控制,缺点就是太麻烦了,太多重复的代码了. 声明式事务:就是使用SpringAop配置事务, ...
- Spring事务回滚失败
下面是一个回滚事务的案例 需求是:转账失败后 转账的事务会回滚,日志事务不会回滚 出现的问题是: 日志事务开启了@Transactional(propagation = Propagation.REQ ...
最新文章
- 笔试题——max pooling滑动窗口实现(python 代码)
- 阿里专家讲中台:技术中台-分布式架构在蚂蚁金服的实践
- 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
- Java根据文件头文件信息判断文件类型
- python redis订阅_Python -- Redis 发布订阅
- java mvc增删改查_springmvc-CRUC增删改查
- 互联网架构的演变,看了好多这个讲的确实清楚!
- 录音喊话器的故障修理_我司quot;XAHHQ1型quot;喊话器 通过公安部检测
- spring事务和mysql的隔离级别
- matlab mxarray赋值,C++中数组与MATLAB mxArray相互赋值
- 页面发送请求到后台报错“Empty or invalid anti forgery header token.”问题解决
- 周剑:国产商业智能 BI 这 20 年(1997~2017)
- OpenCV摄像头标定
- defined 用法
- linux常用网站(不定期更新)
- 老程序员教你如何提高开发效率、成为大神1——人文思维进化与信众
- Debian11安装mysql5.7
- Windows 8.1新型启动方式“WIMBoot”基础简介以及初步探索
- Java基础汇总(十四)——LinkedList,Queue
- 高效办公的Excel小技巧
热门文章
- luo3372线段树模板的分块做法
- 一个和二维泊松求和有关的公式(推导Ewald级数中有用,运用了2D泊松求和公式,傅里叶变换的位移性质)
- java开发工程师初级证,成长路线图
- mysql yearweek 函数周日当做一周开始
- misc-扫扫出奇迹光阴似箭杰斯的魔法
- java计算机毕业设计图书借阅系统的设计与实现源码+系统+数据库+lw文档
- get 请求参数是对象怎么办
- 多旋翼无人机简易改装1——起落架自制可水面起降
- Win10 蓝牙连接2个天猫精灵X5双音频输出
- Word Reciter 1.0.0 日语背单词软件