理解 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 时,所有事务界定的方法都应该返回一个响应式管道。void 方法或常规返回类型需要与常规 PlatformTransactionManager 关联,例如,通过相应 @Transactional 声明的 transactionManager 属性。

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

tx