理解Spring框架的声明式事务实现
仅仅告诉你使用@Transactional注解来标注你的类,在配置中添加@EnableTransactionManagement,并期望你能够理解这一切是如何工作的,这是不够的。为了提供更深入的理解,本节将在与事务相关问题的背景下,解释Spring框架声明式事务基础设施的内部工作原理。
关于Spring框架的声明式事务支持,需要掌握的最重要概念是:这种支持是通过AOP代理来实现的,而且事务处理逻辑是由元数据(目前是基于XML或注解的)来驱动的。AOP与事务元数据的结合产生了一种AOP代理,该代理会利用TransactionInterceptor以及相应的TransactionManager实现来在方法调用过程中管理事务。
Spring AOP 的内容在 AOP 部分 有介绍。
Spring Framework的TransactionInterceptor为命令式和反应式编程模型提供了事务管理功能。该拦截器通过检查方法的返回类型来检测所需的事务管理方式。返回反应式类型(如Publisher或Kotlin的Flow,或其子类型)的方法适用于反应式事务管理。所有其他返回类型(包括void)则使用命令式事务管理的处理流程。
事务管理风格会影响需要使用哪种事务管理器。命令式事务需要PlatformTransactionManager,而反应式事务则使用ReactiveTransactionManager实现。
@Transactional 通常与由 PlatformTransactionManager 管理的线程绑定型事务一起使用,将一个事务暴露给当前执行线程内的所有数据访问操作。注意:这不会传播到方法内新启动的线程。
由 ReactiveTransactionManager 管理的响应式事务则使用 Reactor 上下文,而不是线程局部属性。因此,所有参与的数据访问操作都需要在相同的 Reactor 上下文和相同的响应式管道中执行。
当配置为使用 ReactiveTransactionManager 时,所有被标记为事务的方法都应返回一个响应式管道。空方法或常规返回类型需要与常规的 PlatformTransactionManager 关联起来,例如,可以通过相应的 @Transactional 声明的 transactionManager 属性来实现。
下图展示了在事务代理上调用方法的概念视图:
