理解 Spring 框架的声明式事务实现

仅仅告诉您使用@Transactional注解注释您的类,在您的配置中添加@EnableTransactionManagement,并期望您理解其工作原理是不够的。为了提供更深入的理解,本节将解释 Spring 框架的声明式事务基础设施在事务相关问题上下文中的内部工作原理。

关于 Spring 框架的声明式事务支持,最重要的是要掌握以下概念:此支持是通过 AOP 代理启用的,并且事务性建议由元数据(当前基于 XML 或注解)驱动。AOP 与事务性元数据的组合产生一个 AOP 代理,该代理结合使用TransactionInterceptor和适当的TransactionManager实现来驱动方法调用周围的事务。

Spring AOP 在AOP 部分中进行了介绍。

Spring 框架的TransactionInterceptor为命令式和响应式编程模型提供事务管理。拦截器通过检查方法返回类型来检测所需的事务管理类型。返回响应式类型(例如Publisher或 Kotlin Flow(或这些类型的子类型))的方法符合响应式事务管理的条件。所有其他返回类型,包括void,都使用命令式事务管理的代码路径。

事务管理类型会影响所需的交易管理器。命令式事务需要PlatformTransactionManager,而响应式事务使用ReactiveTransactionManager实现。

@Transactional通常与由PlatformTransactionManager管理的线程绑定事务一起使用,将事务公开给当前执行线程中的所有数据访问操作。注意:这不会传播到方法内部新启动的线程。

ReactiveTransactionManager管理的响应式事务使用 Reactor 上下文而不是线程局部属性。因此,所有参与的数据访问操作都需要在同一 Reactor 上下文中的同一响应式管道中执行。

当与ReactiveTransactionManager配置时,所有事务分隔方法都应返回响应式管道。空方法或常规返回类型需要与常规PlatformTransactionManager关联,例如,通过相应@Transactional声明的transactionManager属性。

下图显示了在事务代理上调用方法的概念视图

tx