为什么阿里规定需要在事务注解 @Transactional 中指定 rollbackFor?

知识梳理:Spring&SpringAop&MyBatis 目录:Spring&SpringAop&MyBatis Spring Framework主要包括几个模块: 支持IoC和AOP的容器; IOC: 依赖注入(Spring容器能力) ,AOP:面向切面编程 .低侵入式为现有业务添加额外功能(切入点编程) 支持JDBC和ORM的数据访问模块; 支持声明式事务的模块; 支持基于Servlet的MVC开发; 支持基于Reactive的Web开发; 以及集成JMS、JavaMail、JMX、缓存等其他模块。 IoC容器 IOC: 控制反转 In 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 8:55 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:blog.youkuaiyun.com/Mint6/article/details/78363761

  • 1.异常的分类

  • 2.@Transactional 的写法

  • 注意


“

阿里巴巴Java规范:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。

1.异常的分类

先来看看异常的分类

error是一定会回滚的

这里Exception是异常,他又分为运行时异常RuntimeException和非运行时异常

  • 可查的异常(checked exceptions):Exception下除了RuntimeException外的异常

  • 不可查的异常(unchecked exceptions):RuntimeException及其子类和错误(Error)

如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果不想终止,则必须捕获所有的运行时异常,决不让这个处理线程退出。

队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而影响下面对正常数据的处理。

非运行时异常是RuntimeException以外的异常,类型上都属于Exception类及其子类。如IOException、SQLException等以及用户自定义的Exception异常。

对于这种异常,JAVA编译器强制要求我们必需对出现的这些异常进行catch并处理,否则程序就不能编译通过。所以,面对这种异常不管我们是否愿意,只能自己去写一大堆catch块去处理可能的异常。

2.@Transactional 的写法

开始主题,@Transactional如果只这样写,

Spring框架的事务基础架构代码将默认地 只 在抛出运行时和unchecked exceptions时才标识事务回滚。

“

也就是说,当抛出个RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将 不 被标识进行事务回滚。

  • 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

  • 让unchecked例外不回滚:@Transactional(notRollbackFor=RunTimeException.class)

  • 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)

“

注意:如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。

注意

Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。

你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。

因为注解是不能继承的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。

@Transactional 注解标识的方法,处理过程尽量的简单。尤其是带锁的事务方法,能不放在事务里面的最好不要放在事务里面。可以将常规的数据库查询操作放在事务前面进行,而事务内进行增、删、改、加锁查询等操作。

“

注:rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。

“

如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

已在知识星球更新源码解析如下:

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 20 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

兄弟,艿一口,点个赞!????

@Transactional注解下自定义异常不回滚的原因及解决方法 最简单的解决方法是将自定义异常类修改为RuntimeException的子类。这样,当我们抛出自定义异常时,Spring将将其视为运行时异常,从而触发事务回滚。// 自定义异常的具体实现// 业务逻辑if (发生异常条件) {throw new CustomException("自定义异常信息");如果我们不想修改自定义异常的继承关系,另一种解决方法是在自定义异常类上添加@Transactional注解,并使用rollbackFor属性指定需要回滚的异常类型。// 自定义异常的具体实现。 阅读详情

相关推荐

CentOS7下OpenVPN Access Server 2.12.0安装与智能分流配置指南

本文详细介绍了在CentOS7系统上安装OpenVPN Access Server 2.12.0并进行智能分流配置的完整指南。从环境准备、核心安装到智能分流策略的深度配置,提供了经过验证的优化方案和故障排查技巧,帮助用户实现高效的VPN网关部署和流量管理。

weixin_30546189的博客 290

@Transactional(rollbackFor = Exception.class)

为什么要指定rollbackFor 阿里开发规范 方法【insertBlog】需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。 原因:spring默认只会再产生运行时异常时回滚事务,而在非运行时异常产生,并且没有被处理是将不会触发回滚 ...

花开的博客 1849

告别水印!Vue3项目集成Stimulsoft.Reports.js完整配置与激活指南

本文详细介绍了如何在Vue3项目中集成Stimulsoft.Reports.js,提供从授权策略到性能优化的完整解决方案。通过模块化架构设计和现代化引入方式,帮助开发者高效实现专业级报表功能,同时避免版权风险和水印问题,特别适合中小型项目需求。

weixin_33701294的博客 432

编程规范——需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。

方法【updateStaffByGarden】需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。 Inspection info: 事务场景中,抛出异常被catch后,如果需要回滚,一定要手动回滚事务。 Positive example 1: /** * @author caikang * @date 2017/04/07 */ @Service @Transaction.

zongx的博客 1万+

Sourcetree与Gitee的完美协作:从身份验证到推送成功的全流程指南

本文提供了一份详细的Sourcetree与Gitee协作全流程指南,重点解决身份验证失败、Git版本配置及远端仓库设置等常见问题。通过分步讲解,帮助用户掌握从克隆、提交到成功推送的完整操作,并整合了使用个人访问令牌进行身份验证等关键热词信息,确保Windows与MacOS用户都能顺畅完成代码管理。

m2n3b4v5c6的博客 709

NVIDIA Omniverse 技术浅析(三):NVIDIA RTX 技术

NVIDIA RTX 技术是 NVIDIA 推出的革命性图形渲染技术,旨在通过硬件加速和软件优化,实现高质量的实时图形渲染。RTX 技术在 NVIDIA Omniverse 平台中扮演着至关重要的角色,为其提供了强大的渲染能力。

m0_75253143的博客 351

使用@Transactional事务注解时,需要指定rollbackFor或者在方法中显式的rollback——编程规范 及 修改办法

抛出异常之后,我们自习写一个try catch捕获,在这里我用了一个自定义异常类来处理异常。我们只需要在方法名上声明事务并设置回滚。

qq_63438013的博客 1686

RV1126笔记二十七:MetaRTC6移植

MetaRTC6移植

6038

为什么阿里规定需要在事务注解@Transactional中指定rollbackFor?

作者:Mint6 来源:http://39sd.cn/53D5D Java阿里巴巴规范提示:方法【edit】需要在Transactional注解指定rollbackFor或者在方法中显示的rollback。 异常的分类 先来看看异常的分类 error是一定会回滚的。 这里Exception是异常,他又分为运行时异常RuntimeException和非运行时异常 可查的异常(checked exceptions):Exception下除了RuntimeException外的异常 不可查的异常(unche.

weixin_46577306的博客 3013

使用LSTM进行多任务学习:共享模型预测多个目标

多任务学习是一种机器学习方法,旨在通过同时学习多个相关任务来提高模型的学习效率和泛化能力。MTL的核心思想是共享模型的参数,从而在不同任务之间捕捉到共享的特征。长短期记忆网络(LSTM)是循环神经网络(RNN)的一种改进版本,专门用于解决传统RNN在处理长序列时出现的梯度消失和梯度爆炸问题。LSTM通过引入多个门控机制(输入门、遗忘门和输出门)来控制信息的流动。本文详细探讨了如何使用LSTM进行多任务学习。我们介绍了多任务学习的理论基础、LSTM的特点,以及如何构建和训练一个多任务LSTM模型。

斌擎科技 1152

优快云独家首发!万字长文,YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程!小白也能看懂!掌握了这个就掌握了魔改YOLO的核心!

🍀🍀🍀YOLOv5/v7/v8算法模型yaml文件史上最详细解析与教程,全网最强,学不会算我输!!!

Coding... 1万+

为什么阿里规定需要在事务注解@Transactional中指定rollbackFor

作者:Mint6blog.youkuaiyun.com/Mint6/article/details/78363761阿里巴巴Java规范:方法【edit】需要在Transactional注解指定ro...

emprere的博客 120

3. NVIDIA GPU Xid 常见错误码全解析、故障定位与标准化处理方案

摘要: Xid是NVIDIA显卡驱动记录的硬件/软件异常日志,通过dmesg等工具可获取,包含PCI总线、GPU编号、故障码等信息,是诊断显卡问题的核心依据。Xid故障分为四类:应用程序类(如代码错误,Xid13/31)、显存ECC硬件类(如显存损坏,Xid48/63)、链路/供电温控类(如PCIe故障,Xid74/79)和GSP固件类(如静电干扰,Xid119/154)。排查流程包括日志采集、软件修复(如重启进程、升级驱动)、硬件检查(如PCIe链路状态)及断电复位(针对GSP故障)。预防措施包括监控EC

jundao1997的专栏 674
上一篇: 今天,你精通 Spring Cloud 了吗?
下一篇: 一款直击痛点的优秀 HTTP 框架,让我超高效率完成了和第三方接口的对接
公众号-芋道源码
博客等级 码龄10年 1631粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值