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

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

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

Spring AOP在AOP部分中有介绍。

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

事务管理方式会影响所需的事务管理器。命令式事务需要一个PlatformTransactionManager,而响应式事务使用ReactiveTransactionManager实现。

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

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

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

以下图片展示了在事务代理上调用方法的概念视图:

tx