当前位置: 首页 > news >正文

@Transactional 标了却没开事务?先看这次调用有没有经过代理

我见过不少项目把这个问题归因成「注解没扫到」。但如果注解明明在、Bean 也正常,先别急着查配置。

多数时候,是调用没经过 Spring 的事务代理。

同一个类里这么调,saveOrder不会被拦截

@Service public class OrderService { public void createOrder() { saveOrder(); } @Transactional public void saveOrder() { orderRepository.save(new Order()); } }

请求进来时,外层确实会先经过OrderService的代理。

createOrder()运行起来以后,调用saveOrder()用的是当前对象的this。它没有再绕回代理,所以事务拦截器根本看不见这次调用。

这也是为什么调试时常会觉得很别扭:@Transactional就贴在方法上,断点也进来了,实际却没有事务。

Spring Framework 的事务文档把这个行为说得很直白:默认代理模式只拦截从代理进入的外部调用,同一对象内部的自调用不会触发事务。

业务入口和事务方法拆开,调用路径就清楚了

我更常用的写法是把编排和落库拆成两个 Bean:

@Service @RequiredArgsConstructor public class OrderFacade { private final OrderService orderService; public void createOrder() { orderService.saveOrder(); } } @Service public class OrderService { @Transactional public void saveOrder() { orderRepository.save(new Order()); inventoryRepository.decrease(); } }

这里OrderFacade注入的是OrderService的代理,调用saveOrder()时才会进入事务边界。

如果事务本来就该覆盖整个createOrder(),那就直接把注解放在入口方法上,内部再调私有的辅助方法。别为了「让注解生效」专门搞自注入,调用链会越来越难看。

事务开了,也不等于所有异常都会回滚

还有一个面试里很容易接着问的点:

@Transactional public void saveOrder() throws IOException { orderRepository.save(new Order()); throw new IOException("network error"); }

默认规则下,RuntimeExceptionError会触发回滚,受检异常不会。上面这段如果没有额外配置,写入仍可能提交。

需要把受检异常也纳入回滚时,明确写出来:

@Transactional(rollbackFor = IOException.class) public void saveOrder() throws IOException { orderRepository.save(new Order()); throw new IOException("network error"); }

排查事务问题时,我一般先看日志里是不是出现了事务边界,再看调用是不是绕过了代理,最后才检查传播行为和回滚规则。

http://www.jsqmd.com/news/1245171/

相关文章:

  • 2026 年新消息:抚州有实力的冷轧无缝钢管供应厂家哪家可靠,揭秘:这个材料如何颠覆管材制造的效率?-赫凤钢管 - 企业推荐官【认证官方】
  • Embedding模型和向量数据库的使用
  • GitHub Actions 自动部署:从 push 到全国可达的完整流程
  • 阿里云与Win2tec体育数字化方案:高并发数据处理实战指南
  • 本地生活门店无人直播落地实践|登登 AI 本地买断数字人部署测评,解决夜间流量承接难题
  • 2026 年当下,安次知名的仓储推拉棚厂商哪家强,别再租店了!这套小工具如何彻底解放你的储物空间?-京鸿雨棚 - 行业推荐官[官方】--
  • 上海及周边地区台式电脑回收行情深度解析:从浦东到昆山的价值评估指南 - 生态测评师
  • 十字链表:数据结构详解与实现
  • Unity游戏资源热更新:基于MD5校验的版本管理机制设计与实现
  • HybridSim混合数字孪生:毫米波人体感知的物理约束学习实践
  • 企业部署AI Agent,90%踩的3个坑
  • ChatGPT宕机应急指南:构建高可用AI开发架构
  • AI编程助手三模型合一:基于Codex框架的集成实战与性能优化
  • Unity移动端性能优化:深度解析Overdraw原理与实战解决方案
  • AI生成文本检测:从特征分析到实战应用
  • 2026 年新消息:西乌珠穆沁旗比较好的汽车托运公司哪个好,托运汽车,这笔费用到底值不值?-兴运通达轿车托运 - 领域鉴赏官
  • TMS570LC4357-EP引脚复用配置实战:从原理到代码的嵌入式硬件设计指南
  • Unity 2D碰撞体自动生成:SmartShape2D原理、优化与实战指南
  • 萧邦中国售后服务中心完整热线电话与网点地址实地考察报告_多信源验证(2026年7月更新) - 萧邦中国官方服务中心
  • 二本通信工程好就业吗?毕业后能做哪些岗位?
  • 抖店一件代发模式通俗讲解:新手落地实操与抖掌柜工具功能完整指南 - 抖掌柜
  • Selenium自动化测试:XPath定位策略与实战技巧详解
  • Redis分布式缓存在微服务架构中的核心价值与实践
  • OpenWrt旁路由设置详解:如何让小米主路由+软路由协同工作(附完整避坑指南)
  • 2026苏州AI Agent开发公司评测制造业落地指南
  • Agentic ABM:从规则驱动到自主决策的智能体建模实践
  • Ray 2.55正式支持Google Cloud TPU:Kubernetes上的分布式AI计算实践
  • AI如何重构科研流程:从计算负担到智能协作者的转型
  • 牛客 26 多校 2 - Imperfect Dot Sums and Cross Sums
  • 外文翻译平台哪个好?2026小语种人工翻译平台深度测评