@TransactionalEventListener 是 Spring 提供的事务提交后触发事件的机制,仅在事务 commit 后执行监听逻辑,支持 AFTER_COMMIT、AFTER_ROLLBACK 和 AFTER_COMPLETION 三种阶段,并可通过配合 @Async 实现异步处理。

@TransactionalEventListener 是 Spring 提供的专门用于在事务成功提交后触发事件监听的机制,它比普通 @EventListener 更可靠——只有当事务真正提交(commit)完成时,监听器才会执行,避免了事务回滚导致的“误处理”问题。
1. 基础用法:监听事务提交后的事件
你需要先发布一个事件(通常在 service 层),再用 @TransactionalEventListener 监听它。Spring 会自动将该监听器绑定到当前事务生命周期中。
- 事件类只需是普通 POJO,无需实现特定接口
- 监听方法必须标注
@TransactionalEventListener,默认 phase 为AFTER_COMMIT - 发布事件需通过
ApplicationEventPublisher,且必须在有事务的方法内调用(否则无事务上下文)
2. 关键配置:确保事务上下文可见
监听器能生效的前提是:事件发布和监听发生在同一个事务上下文中。常见踩坑点:
- 不要在 private 方法或未被代理的方法里发事件(事务代理失效)
- 避免在异步方法(
@Async)中直接发事件——此时可能已脱离原始事务 - 若 service 方法没加
@Transactional,即使用了@TransactionalEventListener也不会等待事务,而是立即执行
3. 控制执行时机:支持多种事务阶段
可通过 phase 属性指定监听时机,常用值:
立即学习“Java免费学习笔记(深入)”;
-
AFTER_COMMIT(默认):事务提交后执行,最常用 -
AFTER_ROLLBACK:仅当事务回滚时触发 -
AFTER_COMPLETION:无论提交还是回滚都执行(类似 finally)
例如:@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
4. 异步执行:搭配 @Async 使用
@TransactionalEventListener 本身是同步回调,但你可以让它调用一个 @Async 方法,实现真正的异步处理:
- 监听方法内不写耗时逻辑,只调用
asyncService.doSomething() -
asyncService的方法需标注@Async,并确保启用了异步支持(@EnableAsync) - 注意:异步方法不能在同一个类内直接调用(绕过代理),应注入自身 bean 或拆到独立 service
这样既保证了“事务提交后才开始”,又实现了“不阻塞主流程”的异步效果。


















