Understanding the Spring Framework’s Declarative Transaction Implementation

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

了解 Spring 框架声明式事务支持的最重要概念是,此支持在 via AOP proxies 中启用,并且事务建议由元数据(当前基于 XML 或注解)驱动。AOP 与事务元数据的组合产生一个 AOP 代理,它使用 TransactionInterceptor 结合适当的 TransactionManager 实现来在方法调用周围驱动事务。

Spring AOP 涵盖在 the AOP section 中。

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

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

@Transactional 通常与由 PlatformTransactionManager 管理的线程绑定事务一起使用,从而向当前执行线程内的所有数据访问操作公开事务。注意:这不传播到方法内新启动的线程。 由 ReactiveTransactionManager 管理的响应式事务使用反应器上下文代替线程局部属性。因此,所有参与的数据访问操作都需要在同一个响应式管道中的同一个反应器上下文中执行。 在使用 ReactiveTransactionManager 进行配置时,所有以事务划界的方法都应该返回一个响应式管道。void 方法或常规返回类型需要与常规 PlatformTransactionManager 相关联,例如通过相应 @Transactional 声明的 transactionManager 属性。

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

tx