Spring 事务属性详解
Spring 事务属性详解Spring 的Transactional注解提供了一组属性用来精确控制事务的行为。这些属性决定了事务如何传播、隔离级别、超时时间、是否只读以及哪些异常触发回滚。一、事务属性总览属性类型默认值作用propagationPropagationREQUIRED事务传播行为isolationIsolationDEFAULT事务隔离级别timeoutint-1不超时事务超时时间秒readOnlybooleanfalse是否只读事务rollbackForClass[]{}触发回滚的异常类型rollbackForClassNameString[]{}触发回滚的异常类名noRollbackForClass[]{}不触发回滚的异常类型noRollbackForClassNameString[]{}不触发回滚的异常类名二、传播行为propagation传播行为定义了事务方法被调用时如何与当前已有事务交互。这是事务属性中最核心、最复杂的一个。传播行为说明适用场景REQUIRED默认。当前有事务则加入没有则新建绝大多数业务方法REQUIRES_NEW挂起当前事务新建独立事务日志记录、审计操作NESTED当前有事务则嵌套执行保存点没有则新建部分回滚场景SUPPORTS当前有事务则加入没有则以非事务执行查询方法NOT_SUPPORTED以非事务方式执行挂起当前事务不需要事务的操作MANDATORY必须在已有事务中执行否则抛异常强制要求事务的方法NEVER必须以非事务方式执行否则抛异常禁用事务的方法Transactional(propagationPropagation.REQUIRED)publicvoidcreateOrder(Orderorder){orderDao.save(order);}最常用的两个// 主业务加入或新建事务Transactional(propagationPropagation.REQUIRED)publicvoidplaceOrder(Orderorder){}// 日志独立事务即使主业务回滚日志也要保留Transactional(propagationPropagation.REQUIRES_NEW)publicvoidsaveLog(Stringmessage){}三、隔离级别isolation隔离级别定义了事务之间的数据可见性解决并发事务的脏读、不可重复读、幻读问题。隔离级别脏读不可重复读幻读DEFAULT使用数据库默认——READ_UNCOMMITTED可能可能可能READ_COMMITTED不会可能可能REPEATABLE_READ不会不会可能SERIALIZABLE不会不会不会Transactional(isolationIsolation.READ_COMMITTED)publicUsergetUser(Longid){returnuserDao.findById(id);}注意DEFAULT表示使用底层数据库的默认隔离级别。MySQL InnoDB 默认是REPEATABLE_READOracle 默认是READ_COMMITTED。四、超时时间timeout事务允许执行的最大时间单位是秒。超时后事务自动回滚。Transactional(timeout30)publicvoidbatchProcess(ListOrderorders){// 超过 30 秒自动回滚}默认值-1表示不超时由数据库自己决定。超时时间不是精确的实际超时可能略有偏差因为检查时机由数据库或框架决定。五、只读事务readOnly标记事务为只读用于优化查询性能。Transactional(readOnlytrue)publicListUserfindAll(){returnuserMapper.selectAll();}只读事务的作用数据库可以做一些优化如不记录回滚日志。提示框架和数据库这个事务不会修改数据。某些数据库驱动会对只读事务做特殊处理。注意readOnly true并不保证一定会阻止写操作。如果只读事务中执行了INSERT、UPDATE、DELETE行为取决于数据库实现可能报错也可能静默执行。六、回滚规则Spring 事务默认只在遇到RuntimeException和Error时回滚。检查型异常Exception的子类不会触发回滚。rollbackFor指定哪些异常触发回滚。Transactional(rollbackFor{BusinessException.class,SQLException.class})publicvoidprocessOrder(Orderorder)throwsBusinessException{// 抛出这些异常时回滚}rollbackForClassName用类名字符串指定效果与rollbackFor相同。Transactional(rollbackForClassName{com.example.BusinessException})noRollbackFor指定哪些异常不触发回滚。Transactional(noRollbackFor{BusinessException.class})publicvoidprocessOrder(Orderorder)throwsBusinessException{// 抛出 BusinessException 时不回滚}noRollbackForClassName用类名字符串指定不触发回滚的异常。Transactional(noRollbackForClassName{com.example.BusinessException})最佳实践默认回滚规则只覆盖RuntimeException。如果业务中会抛出检查型异常务必显式指定rollbackFor Exception.class避免异常被吞掉但数据已提交。Transactional(rollbackForException.class)publicvoidcreateOrder(Orderorder)throwsIOException{// 抛出 IOException 时也回滚}七、完整示例ServicepublicclassOrderService{AutowiredprivateOrderDaoorderDao;AutowiredprivateInventoryDaoinventoryDao;AutowiredprivateLogServicelogService;Transactional(propagationPropagation.REQUIRED,isolationIsolation.READ_COMMITTED,timeout30,readOnlyfalse,rollbackFor{BusinessException.class,SQLException.class},noRollbackFor{NotifyException.class})publicvoidcreateOrder(Orderorder)throwsBusinessException,SQLException{orderDao.save(order);inventoryDao.decrease(order.getProductId(),order.getQuantity());// 日志用独立事务即使主业务回滚日志也保留logService.saveLog(创建订单order.getId());}}八、属性配置方式对比配置方式示例适用场景注解属性Transactional(propagation ...)方法或类级别XML 配置tx:adviceaop:config老项目编程式TransactionTemplate需要动态控制事务边界九、常见问题1. 默认回滚规则不覆盖检查型异常Transactionalpublicvoidprocess()throwsIOException{// IOException 是检查型异常默认不回滚// 需要 rollbackFor Exception.class}2. 传播行为选择不当导致数据不一致// ❌ 日志用 REQUIRED主业务回滚时日志也回滚Transactional(propagationPropagation.REQUIRED)publicvoidsaveLog(Stringmsg){}// ✅ 日志用 REQUIRES_NEW主业务回滚日志仍保留Transactional(propagationPropagation.REQUIRES_NEW)publicvoidsaveLog(Stringmsg){}3. 只读事务中执行写操作Transactional(readOnlytrue)publicvoidupdateUser(Useruser){userDao.update(user);// 可能报错也可能静默执行}4. 超时时间设置过短Transactional(timeout1)publicvoidbatchProcess(){// 批量操作可能超过 1 秒导致意外回滚}5. 隔离级别与数据库默认不一致// MySQL 默认 REPEATABLE_READ显式设置为 READ_COMMITTED 可能改变行为Transactional(isolationIsolation.READ_COMMITTED)十、总结属性核心作用默认值常用值propagation事务传播行为REQUIREDREQUIRED、REQUIRES_NEWisolation事务隔离级别DEFAULTREAD_COMMITTED、REPEATABLE_READtimeout超时时间秒-130readOnly是否只读false查询方法设truerollbackFor触发回滚的异常RuntimeExceptionException.classnoRollbackFor不触发回滚的异常{}业务异常事务属性是Transactional精确控制事务行为的核心。传播行为决定事务如何嵌套隔离级别决定并发时的数据可见性超时时间防止事务长期占用资源只读标记优化查询性能回滚规则决定哪些异常触发回滚。理解这些属性的含义和使用场景才能写出正确、高效的事务代码。

相关新闻

Zotero Connectors迁移Manifest V3全记录:Offscreen Document、Service Worker与webRequestIntercept深度剖析

Zotero Connectors迁移Manifest V3全记录:Offscreen Document、Service Worker与webRequestIntercept深度剖析

Zotero Connectors迁移Manifest V3全记录:Offscreen Document、Service Worker与webRequestIntercept深度剖析 【免费下载链接】zotero-connectors Chrome, Firefox, Edge, and Safari extensions for Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero…

2026/10/10 9:16:54 阅读更多 →
软件测试面试场景题全解析:从框架到实战,帮你理清思路

软件测试面试场景题全解析:从框架到实战,帮你理清思路

我面试过不少测试候选人,也帮团队做过多次技术面。说句实在话,现在的软件测试面试已经越来越卷,光背八股文已经糊弄不过去了。很多公司,尤其是中大厂和做B端产品的团队,特别喜欢问"场景题"——就是给你一个具…

2026/10/10 9:16:54 阅读更多 →
YuE 想生成 3 分钟以上的歌?长歌分段背后的工程真相与翻车实录

YuE 想生成 3 分钟以上的歌?长歌分段背后的工程真相与翻车实录

YuE 想生成 3 分钟以上的歌?长歌分段背后的工程真相与翻车实录 【免费下载链接】YuE YuE2: frontier music generation with symbolic planning, zero-shot covers, and agentic music editing. 项目地址: https://gitcode.com/GitHub_Trending/yue/YuE 当谷…

2026/10/10 9:15:54 阅读更多 →

最新新闻

代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录67天刷题总结:算法模板、避坑与面试转化

代码随想录刷到第67天,说实话,这一天比我想象中来得平静。没有“终于结束了”的解脱感,也没有“我全都学会了”的兴奋,更多的是一种踏实的收束感。从第一天的数组二分查找开始,到后来二叉树、回溯、动规、单调栈&#…

2026/10/11 13:10:49 阅读更多 →
探索地块建立全解析:Java+JS+Python三端协作实战

探索地块建立全解析:Java+JS+Python三端协作实战

从赛题公布到最终提交,我前后花了将近两周时间。“新卷200分”里的这道“探索地块建立”,要求用三种语言各完成一轮闭环,确实不是单纯考某个语法点能应付过去的。很多朋友一看到“探索地块建立(Java & JS & Python&#x…

2026/10/11 13:10:49 阅读更多 →
Cursor 智能提交实战:用 AI 生成规范 Git Commit Message 的完整工作流

Cursor 智能提交实战:用 AI 生成规范 Git Commit Message 的完整工作流

最近我的 git 提交流程发生了不小的变化。以前写完代码顺手敲一句“fix bug”“update code”“改了一堆东西”就推了,等过了两周回来看历史记录,完全想不起来当时改了啥。后来我开始试着让 Cursor 的 AI 帮我生成 commit message,再进一步让…

2026/10/11 13:10:49 阅读更多 →
微信小程序实时语音识别接入指南:从鉴权到帧流处理

微信小程序实时语音识别接入指南:从鉴权到帧流处理

简介:微信小程序语音识别项目是一套面向微信小程序开发者的完整工程示例,围绕科大讯飞语音识别接口展示语音转文字、实时语音输入与智能语音交互的实现思路,适合具备一定JavaScript基础、希望在小程序中快速接入AI语音能力的开发者学习。压缩…

2026/10/11 13:10:49 阅读更多 →
基于SSM的软件缺陷管理系统:从选题到答辩全流程详解

基于SSM的软件缺陷管理系统:从选题到答辩全流程详解

每到毕业季,群里最热闹的问题永远是“毕设做什么题目好”。作为一个经常带学生做项目的过来人,我的回答一般都很直接:软件缺陷管理系统,这个题目别嫌弃它老,放到2026年依然是性价比极高的选择。只要有SSM框架和Java基础…

2026/10/11 13:10:49 阅读更多 →
如何看懂 Portabase 安全机制:AES-256-GCM凭据加密、RBAC与Passkey登录完整指南

如何看懂 Portabase 安全机制:AES-256-GCM凭据加密、RBAC与Passkey登录完整指南

【免费下载链接】portabase Portabase - Database backup & restore tool for PostgreSQL, MySQL, MsSQL, MariaDB, Firebird SQL, SQLite, MongoDB, Redis and Docker Volume 项目地址: https://gitcode.com/gh_mirrors/por/portabase 点击查看 免费下载 Por…

2026/10/11 13:09:49 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →