讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java里异常会影响事务的回滚吗_Java事务异常处理说明

酷静大大_1145

酷静大大_1145

发布时间:2026-02-05 10:06:02

|

381人浏览过

|

来源于php中文网

原创

Spring声明式事务默认仅对RuntimeException和Error回滚;需对Exception回滚须显式配置rollbackFor;try-catch吞异常、非public方法、内部调用及传播行为不当均导致回滚失效。

在java里异常会影响事务的回滚吗_java事务异常处理说明

抛出 RuntimeException 及其子类会触发回滚

Spring 的声明式事务默认只对 RuntimeException 和 Error 回滚,对普通 Exception(比如 IOException、SQLException)不会自动回滚。这是最容易踩的坑——明明代码里 throw new Exception("xxx"),事务却没回滚。

实操建议:

  • 如果业务逻辑中需要检查型异常(checked exception)也触发回滚,必须显式配置:@Transactional(rollbackFor = Exception.class)
  • 避免直接 throw new Exception(),优先使用语义明确的运行时异常,如 IllegalArgumentException、IllegalStateException
  • 注意:自定义异常若继承 Exception 而非 RuntimeException,同样不会触发默认回滚

@Transactional 方法内 try-catch 吞掉异常会导致回滚失效

事务代理是基于 AOP 实现的,异常必须“冒泡”到代理层才能被拦截并触发回滚。一旦在方法内部用 try-catch 捕获且未重新抛出,Spring 就收不到异常信号。

常见错误现象:

立即学习“Java免费学习笔记(深入)”;

  • 方法末尾没有 throw,日志打了异常,数据库却已提交
  • catch 块里只做补偿操作(如发消息),但没 throw 或 throw new RuntimeException(e)

正确做法:捕获后决定是否继续传播,例如:

@Transactional
public void transfer(Long fromId, Long toId, BigDecimal amount) {
    try {
        accountDao.debit(fromId, amount);
        accountDao.credit(toId, amount);
    } catch (InsufficientBalanceException e) {
        // 业务异常,转为运行时异常确保回滚
        throw new RuntimeException(e);
    }
}

非 public 方法上加 @Transactional 注解无效

Spring 事务代理默认使用 JDK 动态代理(针对接口)或 CGLIB(针对类),但两者都要求目标方法是 public。如果把 @Transactional 加在 private、protected 或包级方法上,注解完全不起作用——连事务开启都不会发生,更谈不上回滚。

验证方式:

  • 开启事务日志:logging.level.org.springframework.transaction=DEBUG,观察是否有 Creating new transaction 日志
  • 故意在该方法里抛异常,看数据库是否真的回滚

注意:即使方法是 public,但如果通过 this.method() 内部调用,也会绕过代理,导致事务失效。

事务传播行为影响异常是否“传染”给外层事务

比如外层方法标注 @Transactional(propagation = Propagation.REQUIRED),内层方法标注 @Transactional(propagation = Propagation.REQUIRES_NEW),此时内层事务独立提交/回滚,它的异常默认不会导致外层回滚——除非外层显式捕获并重抛。

关键点:

  • REQUIRES_NEW 创建全新事务,内层异常只回滚自己,不影响外层
  • NESTED 支持保存点(savepoint),内层异常可回滚到保存点,外层仍可继续
  • 跨事务边界的异常传递,不能依赖默认行为,必须结合业务逻辑手动控制抛与不抛

最常被忽略的是:两个 @Transactional 方法之间隔着一层非事务方法(比如工具类静态方法),异常根本传不到事务边界,回滚自然失效。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2611

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

477

2026.01.26

spring框架介绍
spring框架介绍

本专题整合了spring框架相关内容,想了解更多详细内容,请阅读专题下面的文章。

2611

2025.08.06

Java Spring Security 与认证授权
Java Spring Security 与认证授权

本专题系统讲解 Java Spring Security 框架在认证与授权中的应用,涵盖用户身份验证、权限控制、JWT与OAuth2实现、跨站请求伪造(CSRF)防护、会话管理与安全漏洞防范。通过实际项目案例,帮助学习者掌握如何 使用 Spring Security 实现高安全性认证与授权机制,提升 Web 应用的安全性与用户数据保护。

477

2026.01.26

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

989

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3000

2023.10.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

3148

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

4949

2025.10.17

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
dev.java 官方:Learn Java
dev.java 官方:Learn Java

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn