跳到主要内容

事务绑定事件

ChatGPT-4o 中英对照 Transaction-bound Events

从 Spring 4.2 开始,事件的监听器可以绑定到事务的某个阶段。典型的例子是在事务成功完成时处理事件。这样做可以让事件在当前事务的结果对监听器确实重要时更加灵活地使用。

您可以使用 @EventListener 注解注册一个常规事件监听器。如果您需要将其绑定到事务,请使用 @TransactionalEventListener。这样做时,监听器默认绑定到事务的提交阶段。

下一个示例展示了这个概念。假设一个组件发布了一个订单创建事件,并且我们希望定义一个监听器,该监听器应该只在事件发布的事务成功提交后处理该事件。以下示例设置了这样一个事件监听器:

@Component
public class MyComponent {

@TransactionalEventListener
public void handleOrderCreatedEvent(CreationEvent<Order> creationEvent) {
// ...
}
}
java

@TransactionalEventListener 注解提供了一个 phase 属性,可以让你自定义监听器绑定到的事务阶段。有效的阶段有 BEFORE_COMMITAFTER_COMMIT(默认)、AFTER_ROLLBACK,以及 AFTER_COMPLETION,后者聚合了事务完成(无论是提交还是回滚)。

如果没有事务正在运行,则监听器根本不会被调用,因为我们无法满足所需的语义。然而,您可以通过将注解的 fallbackExecution 属性设置为 true 来覆盖该行为。

备注

从 6.1 版本开始,@TransactionalEventListener 可以与由 PlatformTransactionManager 管理的线程绑定事务以及由 ReactiveTransactionManager 管理的响应式事务一起工作。对于前者,监听器保证能够看到当前线程绑定的事务。由于后者使用 Reactor 上下文而不是线程本地变量,因此需要在发布的事件实例中将事务上下文作为事件源包含进去。详情请参阅 TransactionalEventPublisher javadoc。