news 2026/7/26 23:50:17

Async和Transactional自调用不生效我查了一上午才发现是同一个坑

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Async和Transactional自调用不生效我查了一上午才发现是同一个坑

我招了一个实习生,让他写个异步处理任务。他用 Spring 的@Async写了一个 Service,怎么调都不生效。

代码长这样:

@ServicepublicclassOrderService{publicvoidprocess(LongorderId){this.sendNotification(orderId);// 希望异步执行}@AsyncpublicvoidsendNotification(LongorderId){// 发通知...}}

他说「我加了 @Async 了啊,为什么还是同步执行的?」

我一看就笑了——自己调自己,AOP 管不了你


为什么 @Async 不生效

Spring 的@Async@Transactional@Cacheable这些注解都是通过 AOP 代理实现的。

Spring 会给 Bean 创建一个代理对象。你调用orderService.process()时,实际上调用的是代理对象的方法。代理对象在方法前后织入事务、异步等逻辑。

但问题来了:process()方法里this.sendNotification()——这个this原始对象,不是代理对象。原始对象调用sendNotification()时,Spring 根本没有机会拦截,直接执行了原始方法。

@Transactional自调用不生效,也是同一个道理。

三种解法

解法一:注入自己(最简单)

@ServicepublicclassOrderService{@AutowiredprivateOrderServiceself;// 注入代理对象publicvoidprocess(LongorderId){self.sendNotification(orderId);// 通过代理调用}@AsyncpublicvoidsendNotification(LongorderId){// 现在真正异步了}}

注意:Spring 4.3+ 之后,如果构造器注入会循环依赖报错,用@Lazy解决:

@Lazy@AutowiredprivateOrderServiceself;

解法二:拆成两个 Service(最推荐)

@ServicepublicclassOrderService{@AutowiredprivateNotificationServicenotificationService;publicvoidprocess(LongorderId){notificationService.sendNotification(orderId);}}@ServicepublicclassNotificationService{@AsyncpublicvoidsendNotification(LongorderId){// 独立的异步 Service}}

这样结构清晰,职责单一,测试也好写。

解法三:用 ApplicationContext 拿代理

@ServicepublicclassOrderService{@AutowiredprivateApplicationContextctx;publicvoidprocess(LongorderId){OrderServiceproxy=ctx.getBean(OrderService.class);proxy.sendNotification(orderId);}}

这种偏 Hack,能不用就不用。

不只是 @Async

同样的坑,@Transactional也一样:

@ServicepublicclassUserService{@TransactionalpublicvoidcreateUser(Useruser){userMapper.insert(user);this.updateStats();// 事务不会生效!}@Transactional(propagation=Propagation.REQUIRES_NEW)publicvoidupdateStats(){// 你以为会开启新事务,其实没有}}

自调用 = 没有事务、没有异步、没有缓存。记住这一条就够了。


核心要点:

  • @Async/@Transactional自调用不生效,因为this不是代理对象
  • ✅ 解法一:注入自己@Autowired self
  • ✅ 解法二:拆成两个 Service(推荐)
  • ✅ 解法三:ApplicationContext.getBean()(不推荐)
  • ✅ 不是 Bug,是 Spring AOP 代理机制决定的

关于作者:无羡,独立开发者,全栈工程师,专注 AI 应用与微服务架构。

📌 分类:技术复盘

🔗 个人博客 — 更多技术文章
✨ 开发者福利整理 — 云服务资源汇总
📂 软件工坊 — 我的技术分享
🌐 个人门户 — 独立开发作品全集

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/26 23:48:36

AI Bugfix Agent:系统级Bug自动定位与修复技术解析

1. 项目背景与核心价值在软件开发领域,Bug修复往往占据开发团队30%以上的工作时间。传统人工排查方式存在效率瓶颈,特别是在处理系统级问题时,经常需要跨多个模块进行上下文分析。我们团队开发的AI Bugfix Agent正是为了解决这一痛点——它通…

作者头像 李华
网站建设 2026/7/26 23:48:26

FAB工程师35岁危机:离开FAB,我还能干什么

一、那个凌晨3点的电话,让我开始认真思考未来那天凌晨3点,我被一阵电话铃声吵醒。工厂打电话来,说某个批次的良率突然下降了20%,让我赶紧进厂处理。我翻身起床,穿上衣服,在黑暗中开车赶了40分钟到工厂。处理…

作者头像 李华
网站建设 2026/7/26 23:43:59

三月七小助手:崩坏星穹铁道全自动游戏管家终极指南

三月七小助手:崩坏星穹铁道全自动游戏管家终极指南 【免费下载链接】March7thAssistant 崩坏:星穹铁道全自动 三月七小助手 项目地址: https://gitcode.com/gh_mirrors/ma/March7thAssistant 你是否厌倦了每天重复刷材料、清体力的枯燥操作&#…

作者头像 李华
网站建设 2026/7/26 23:43:57

ExifToolGui:专业图片元数据管理的图形化解决方案

ExifToolGui:专业图片元数据管理的图形化解决方案 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui 在数字摄影和图像管理领域,元数据管理是专业工作流程中不可或缺的一环。ExifToolGu…

作者头像 李华
网站建设 2026/7/26 23:42:46

终极华硕笔记本控制方案:G-Helper让你的设备性能翻倍

终极华硕笔记本控制方案:G-Helper让你的设备性能翻倍 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Exp…

作者头像 李华