spring事务回滚技巧

Spring Boot 各种事务操作实战(自动回滚、手动回滚、部分回滚) 事务,就是一组操作数据库的动作集合。事务是现代数据库理论中的核心概念之一。如果一组处理步骤或者全部发生或者一步也不执行,我们称该组处理步骤为一个事务。当所有的步骤像一个操作一样被完整地执行,我们称该事务被提交。由于其中的一部分或多步执行失败,导致没有步骤被提交,则事务必须回滚到最初的系统状态。 阅读详情

1、遇到的问题
当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:

public method() {
   Dao1.save(Person1);
   Dao1.save(Person2);
   Dao1.save(Person2);
   //假如这句发生了错误,前面的两个对象会被保存到数据库中
   Dao1.save(Person2);
}

期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存

正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧。

当遇到这种情况,我们就可以使用Spring的事务解决这个问题。
2、异常的一些基本知识

  1. 异常的架构
    Throwable为基类,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception。

Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。
在这里插入图片描述
2)Error异常
Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在程序中不用捕获Error类型的异常。一般情况下,在程序中也不应该抛出Error类型的异常。

3)RuntimeException异常
Exception异常包括RuntimeException异常和其他非RuntimeException的异常。
  
RuntimeException 是一种Unchecked Exception,即表示编译器不会检查程序是否对RuntimeException作了处理,在程序中不必捕获RuntimException类型的异常,也不必在方法体声明抛出RuntimeException类。

RuntimeException发生的时候,表示程序中出现了编程错误,所以应该找出错误修改程序,而不是去捕获RuntimeException。

4)Checked Exception异常
Checked Exception异常,这也是在编程中使用最多的Exception,所有继承自Exception并且不是RuntimeException的异常都是checked Exception,上图中的IOException和ClassNotFoundException。

JAVA 语言规定必须对checked Exception作处理,编译器会对此作检查,要么在方法体中声明抛出checked Exception,要么使用catch语句捕获checked Exception进行处理,不然不能通过编译。
3、实例
这里使用的事务配置如下:

<!-- Jpa 事务配置 -->
   <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
       <property name="entityManagerFactory" ref="entityManagerFactory"/>
   </bean>
   
   <!-- 开启注解事务 -->
   <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />

在spring的配置文件中,如果数据源的defaultAutoCommit设置为True了,那么方法中如果自己捕获了异常,事务是不会回滚的,如果没有自己捕获异常则事务会回滚,如下例

比如配置文件里有这么条记录

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> 

<property name="xxx" value="xxx"/> 

<property name="xxx" value="xxx"/>

....
<property name="defaultAutoCommit" value="true" /> 

</bean>

可能你会发现你并没有配置这个参数,是不是他就不会自动提交呢?答案是不是的,我这里是使用了com.alibaba.druid.pool.DruidDataSource作为数据库连接池,默认的defaultAutoCommit就是true,可以看下面的源码
在这里插入图片描述
那么现在有两个情况
  
情况1:如果没有在程序中手动捕获异常

@Transactional(rollbackOn = { Exception.class })  
public void test() throws Exception {  
    doDbStuff1();  
    doDbStuff2();
//假如这个操作数据库的方法会抛出异常,
//现在方法doDbStuff1()对数据库的操作   会回滚。  
}

情况2:如果在程序中自己捕获了异常

@Transactional(rollbackOn = { Exception.class })  
public void test() {  
    try {  
       doDbStuff1();  
       doDbStuff2();
//假如这个操作数据库的方法会抛出异常,
//现在方法doDbStuff1()对数据库的操作  不会回滚。  
    } catch (Exception e) {  
          e.printStackTrace();     
    }  
}

现在如果我们需要手动捕获异常,并且也希望抛异常的时候能回滚肿么办呢?
  
下面这样写就好了,手动回滚事务:

@Transactional(rollbackOn = { Exception.class })  
public void test() {  
   try {  
      doDbStuff1();  
      doDbStuff2();  
   } catch (Exception e) {  
        e.printStackTrace();     
        TransactionAspectSupport.currentTransactionStatus()
        .setRollbackOnly();
    //就是这一句了,加上之后,如果doDbStuff2()抛了异常,
    //doDbStuff1()是会回滚的  
   }  
}

参考:添加链接描述

Spring中的事务回滚机制 问题:初学者在Java项目汇中,添加@Transactional注解,报错之后,事务回滚未生效,数据仍插入数据库中.经查看报错位置位于新增成功之后.空指针异常.经过查看和总结,其中有错误的,请留言,会尽快改正. 一、特性 先了解一下@Transactional注解事务的特性,可以更好排查问题 1、service类标签(一般不建议在接口上)上添加@Transactional,可以将整个类纳入spri... 阅读详情

相关推荐

远心F-theta镜ZEMAX设计

根据给出的F-theta镜的设计指标,对F-theta镜进行了具体的光学设计。从对F-theta镜设计思想的介绍出发,对选取的初始结构进行了优化设计,优化完成后,对所设计的F-theta镜进行了像质评价,通过点列图、场曲与畸变图、相对照度、能量集中度对所设计的F-theta镜进行了分析,最终,对F-theta镜的设计效果进行了验证。

hitliuyi17的博客 9428

事物场景当中,抛出异常被catch之后,如果要回滚事务,一定要手动回滚

Positive example 1:    @Service    @Transactional(rollbackFor = Exception.class)    public class UserServiceImpl implements UserService{        @Override        public void save (User user){          ...

小小坚的博客 6706

概率整形 Peobabilistic Shaping PS 第一节

概率整形概述 概率整形(Peobabilistic Shaping, PS)是一种针对于调制格式的优化技术,它为光通信通信提供了非常高的灵活性,但不会增加系统复杂性。尤其是光通信中的非线性问题会限制功率,使得PS就像为光通信量身定做的一样。 PS技术能够在不增加发送功率的前提下,获得高频谱效率和传输容量。2016年在使用PS技术的实验中实现了6600km单模光纤的65Tbit/s数据的传输。 到目前位置PS技术的研究主要集中在具有相干检测的单载波光纤传输。 概率整形的基本原理 概率整形技术就是通过在编码前

Explore_OuO的博客 8126

Spring控制事务回滚

调用本类方法导致传播行为失效,同一个 Service 的两个方法之间调用,就会出现这个问题,原因还是在代理对象这里,我们期待的调用是一个代理类的调用,但是我们若是直接在方法中内部调用,不好意思,被调用的方法的事务失效,没有被 AOP 增强。当添加了注解或者全局事务配置了路径,但是需要用到事务的方法所在的类没有注入到Spring容器中,这样事务也不会生效,通常我们都是添加到业务逻辑处理层,通常都是添加。:在业务代码中,需要对异常单独进行处理,异常不会抛出,但需要事务回滚的情况,这个时候就需要手动调用回滚。

BadBoyxiaolin的博客 6475

分享一些基于微信小程序开发的小游戏源码

小游戏小程序是运行在微信生态系统(或其他支持小程序的平台)中的轻量级应用程序,专为休闲游戏体验而设计的小程序子类别,小游戏小程序通常体积较小,加载速度快,用户无需等待长时间即可开始游戏。用户无需下载或安装单独的游戏应用程序,即可通过小程序入口直接进入游戏,同时小游戏小程序通常包含排行榜、分享功能等社交元素,可以增强游戏体验并促进用户参与。game.js:游戏页面的逻辑文件,包含页面数据、生命周期函数、事件处理函数等。game.wxml:游戏页面的结构文件,定义了页面的布局和组件。

xinshangdian的博客 6229

PCL 法线定向【2025最新版】

几种法线定向方法的PCL代码实现。

点云侠的博客 2805

spring手动回滚

spring事务手动回滚

weixin_50673869的博客 1382

5步VS传统WinForm!AntdUI让界面设计从“土味”到“超模”只需30秒?

摘要:墨瑾轩编程教程《AntdUI的5大魔法步骤》详解如何将传统WinForm升级为现代化UI。教程通过5个核心步骤:安装AntdUI库、控件替换、主题定制、复杂布局构建及实战案例演示,对比传统开发与AntdUI在美观度(动态阴影/动画)、开发效率(拖拽组件VS手工绘制)和主题定制(一键换肤VS重写控件)的显著差异。使用C#代码示例展示按钮动画、3D翻转、聊天界面等特效实现,帮助开发者快速掌握这一基于Ant Design风格的WinForm增强框架。(150字)

java专栏 1129

spring事物回滚

1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:publicmethod() {   Dao1.save(Person1);   Dao1.save(Person2);   Dao1.save(Person2);   //假如这句发生了错误,前面的两个对象会被保存到数据库中   Dao1.save(Person2);}期待的情况:发生错误之前的所...

u012954380的博客 620

【BlueDroid】【BLE】低功耗蓝牙客户端和服务端开发流程解析(超详细)

1. 精讲):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论2. 欢迎大家关注和订阅,和专栏会持续更新中.....敬请期待!

风云说通信 1925

基于YOLO的印章检测及文字识别

针对印章自动化检测与文字识别需求,提出了一种融合改进YOLO模型与OCR技术的端到端解决方案,旨在解决复杂背景干扰、印章残缺变形及环形文字排列等难题

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 8222

spring mysql 事物回滚吗_spring之事务回滚技巧

1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:public method() {Dao1.save(Person1);Dao1.save(Person2);Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中Dao1.save(Person2);}期待的情况:发生错误之前的所有数据库保存操作都回滚,即不...

weixin_35133814的博客 375

dolphinscheduler集群服务一键安装启动实现流程剖析

通过以上分析我们基本梳理清楚了整个dolphinscheduler项目的一键安装启动逻辑, 我们现在在通过一张图正好理一下整个实现流程。关于一键停止集群服务及一件查询集群各个角色服务实例运行状态的实现也都在stop-all.sh/status-all.sh及dolphinscheduler-daemon.sh这三个脚本中, 有兴趣自行研究。写这篇文章的核心目的不仅在于给大家分享如何优秀的开源项目的一键安装部署的实现过程。

最爱嫣夜来 1207

java手动提交事务_spring之事务回滚技巧

作者:WhyWin原文:http://www.cnblogs.com/0201zcr/p/5962578.html1、遇到的问题当我们一个方法里面有多个数据库保存操作的时候,中间的数据库操作发生的错误。伪代码如下:期待的情况:发生错误之前的所有数据库保存操作都回滚,即不保存正常情况:前面的数据库操作会被执行,而发生数据库操作错误开始及之后的所有的数据保存操作都将失败。这样子应该都不是我们要的结果吧...

weixin_39956350的博客 1216

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

spring 声明式事务配置,主动抛出异常不回滚。

默认spring只在发生未被捕获的RuntimeException时才回滚。   原文:http://blog.youkuaiyun.com/ky498320858/article/details/6576121     最笨的办法:代码级控制:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();   为...

887

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Spring事务异常回滚三种方案——捕获异常不抛出就不会回滚

下面这种情况,使用了catch捕获了异常,spring事务不会发生回滚 try { userDao.save(user); userCapabilityQuotaDao.save(capabilityQuota); } catch (Exception e) { logger.info("能力开通接口,开户异常,异常信息:"+e); } 默认spring事务只在发生未被捕获的RuntimeException时才回滚。 springaop 异常捕获原理:被拦截的方法需显式抛出异...

HD243608836的博客 5196

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

spring事物回滚机制 (事务异常回滚,捕获异常不抛出就不会回滚)

当异常被捕获catch的时候,spring的事物则不会回滚 为什么不会滚呢?? spring aop异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常; 解决方案: 1、例如service层处理事务,那么service中的方法中不做异常捕获,或者在catch语句中最后增加throw new RuntimeException()语句,以便让aop捕获异常再去回滚,并且在serv...

qq_16467435的博客 4184

关于Spring的@Transactional注解失效以及事务无法回滚问题

关于Spring的@Transactional注解失效以及事务无法回滚问题@Transactional失效问题最近写的项目中需要一个service中的部分事务执行完就被commit,但是部分service需要失败回滚。因此写在一个大的service中并且加上@Transactional显然是无法满足需求的。 因此这是需要把原先的一个service服务拆分,如原先的serviceA被拆分成servic

lee_star1的博客 8790

Spring事务的传播规则以及各种场景下事务的生效情况

前言: 从大学学完《Web程序设计》这门课之后,我一直在使用Spring这个框架,它的优点和好处不言而喻。随着时间的推移,我对这个框架的理解也不断加深,自己也有了一些使用的技巧与经验,下面我将分享关于Spring事务中的一些知识,希望对大家的工作、学习、面试有一些帮助。分享的内容主要包括事务何时生效、事务的传播规则和嵌套事务的使用等。如有偏差,请君不吝赐教! 一、相关知识点(这里只写文中用到的知识点): 1.物理事务与逻辑事务: 物理事务:事务性资源实际打开的事务,如数据库的Connection打开

hanxiaozhang的博客 2080

Spring事务管理详解+案例

Spring事务管理详解Spring事务事务简介事务原则Java事务Java事务类型事务类型差异Spring事务核心接口 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200311210812187.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0...

SpringWaterLikeMe 1327

Spring Boot事务管理:自动回滚与手动控制详解

事务管理是保证数据一致性的核心技术,Spring Boot通过@Transactional注解提供了声明式事务支持。理解事务的自动回滚机制是关键,默认情况下Spring只对RuntimeException和Error进行回滚,但可以通过rollbackFor属性自定义回滚规则。在实际工程中,除了自动回滚外,手动回滚通过TransactionAspectSupport.currentTransactionStatus()提供了更灵活的控制方式。分布式场景下,Seata框架和消息队列能解决跨服务事务问题。合理设

weixin_31031711的博客 339

Spring的回滚问题

再说下声明式事务和注解事务回滚的原理:当被切面切中或者是加了注解的方法中抛出了RuntimeException异常时,Spring会进行事务回滚。默认情况下是捕获到方法的RuntimeException异常,也就是说抛出只要属于运行时的异常(即RuntimeException及其子类)都能回滚;但当抛出一个不属于运行时异常时,事务是不会回滚的。 下面说几点保证事务能回滚的方法: ① ...

113

spring事务的7种传播机制

Spring事务的传播行为 在service类前加上@Transactional,声明这个service所有方法需要事务管理,每一个业务方法开始时都会打开一个事务。 spring默认情况下会对运行期例外(runtimeException)进行回滚,这个例外是unchecked的,如果是checked的就不回滚。 如果改变默认规则: 1.让checked例外也回滚,在整个方法前加上: @T...

Ha_Pipi的博客 3539

Spring_声明式事务

Spring声明式事务1. Spring事务管理1.1 编程式事务1.2 声明式事务1.3 Spring 声明式事务的实现2. 细节问题2.1 事务超时---timeout2.2 只读事务---readOnly2.3 触发事务回滚的异常--- rollbackFor, noRollbackFor2.4 隔离级别---isolation2.4.1 事务并发问题2.4.2 隔离级别2.4.3 Spring 中指定事务隔离级别---isolation2.5 传播行为---propagation3. 基于XML的声

qq_35199832的博客 474

jpa transaction 回滚_JPA的事务注解@Transactional使用总结

在项目开发过程中,如果您的项目中使用了Spring的@Transactional注解,有时候会出现一些奇怪的问题,例如:明明抛了异常却不回滚?嵌套事务执行报错?...等等很多的问题都是没有全面了解@Transactional的正确使用而导致的,下面一段代码就可以让你完全明白@Transactional到底该怎么用。直接上代码,请细细品味@Servicepublic classSysConfigSe...

weixin_42181929的博客 875

spring的嵌套事务问题

目录 线上问题: 事务注意事项 总结: 线上问题: 仔细分析了抛出的异常,发现异常为SocketTimeoutException,查阅事务回滚时需要的异常,发现 默认事务只对error和runtimeException异常会进行回滚,其他异常不会回滚,https://www.cnblogs.com/tianyuchen/p/6678084.html 加上@Transactional(rollbackFor=MyException.class)后事务会捕捉到此类异常, 在Spring里,同

LiZhen314的博客 478
上一篇: HashTable与HashMap的区别
daxiangPro
博客等级 码龄12年 1粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值