SpringFramework — 事务监听

小龙 507 2022-06-22

事务监听器

事务也是有监听器的,可以试想一下几个场景

  • 事务执行成功,提交之后,通知特定的组件发送成功的消息
  • 事务执行失败,回滚完事务之后,记录失败的日志
  • 无论事务执行成功还是失败,只要事务执行完成,就记录事务执行的日志

可以发现一个特点,这些事务执行之后的动作,大多都不是主干业务逻辑中的内容,而是不太重要的、可能还比较耗时(譬如发短信、发邮件等)。这种动作一般不会耦合进 Service 的业务逻辑中,而是使用 AOP 增强,或者使用监听器 + 事件更为合适。

事务监听器的设计

事务的监听器,是基于 SpringFramework 的监听器扩展的,它来自 SpringFramework 4.2

事务事件监听器的核心注解:@TransactionalEventListener :

@EventListener
public @interface TransactionalEventListener {
    TransactionPhase phase() default TransactionPhase.AFTER_COMMIT;

    boolean fallbackExecution() default false;
    
    @AliasFor(annotation = EventListener.class, attribute = "classes")
    Class<?>[] value() default {};

    @AliasFor(annotation = EventListener.class, attribute = "classes")
    Class<?>[] classes() default {};

    String condition() default "";
}

可以发现,其实事务事件监听器的本质,还是一个普通的注解式事件监听器而已,只是它里面设计的字段与 @EventListener 不同罢了。

但是在 @TransactionalEventLister 注解中有一个最最关键的属性:phase,它代表的是事务在那个阶段触发监听,默认值是 AFTER_COMMIT,代表提交之后触发。phase 的属性定义在 TransactionPhase 枚举类中,这个枚举中定义了 4 种可选范围:

public enum TransactionPhase {
	BEFORE_COMMIT,
	AFTER_COMMIT,
	AFTER_ROLLBACK,
	AFTER_COMPLETION
}
  • BEFORE_COMMIT:事务提交之前触发监听
  • AFTER_COMMIT:事务提交之后触发监听
  • AFTER_TOLLBACK:事务回滚之后触发监听
  • AFTER_COMPLETION:事务完成之后触发监听(无论提交还是失败)

# 事务 # Listener # Event