此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

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

仅仅告诉您使用@Transactional注释, 添加@EnableTransactionManagement到您的配置, 并期望您了解这一切是如何运作的。为了提供更深入的理解,这个 部分解释了 Spring 框架声明式事务的内部工作原理 与交易相关的问题背景下的基础设施。spring-doc.cadn.net.cn

关于 Spring Framework 的声明式,需要掌握的最重要的概念 事务支持是通过 AOP 代理启用此支持,并且事务性 建议由元数据驱动(目前基于 XML 或注释)。AOP的组合 使用事务元数据生成一个 AOP 代理,该代理使用TransactionInterceptor在 与适当的TransactionManager推动交易的实施 围绕方法调用。spring-doc.cadn.net.cn

AOP 部分介绍了 Spring AOP。

Spring 框架的TransactionInterceptor提供事务管理 命令式和响应式编程模型。拦截器检测所需的风味 通过检查方法返回类型来管理事务。返回响应式的方法 类型,例如Publisher或 KotlinFlow(或其中的一个子类型)符合反应性条件 事务管理。所有其他返回类型,包括void将代码路径用于 命令式事务管理。spring-doc.cadn.net.cn

事务管理风格会影响需要哪个事务管理器。祈使的 事务需要PlatformTransactionManager,而响应式事务使用ReactiveTransactionManager实现。spring-doc.cadn.net.cn

@Transactional通常适用于由PlatformTransactionManager,将事务暴露给 当前执行线程。注意:这不会传播到新启动的线程 在方法中。spring-doc.cadn.net.cn

ReactiveTransactionManager使用 Reactor 上下文 而不是线程本地属性。因此,所有参与的数据访问 作需要在同一响应式管道中的同一 Reactor 上下文中执行。spring-doc.cadn.net.cn

当配置ReactiveTransactionManager,所有事务划界方法 应返回响应式管道。void 方法或常规返回类型需要 与常规PlatformTransactionManager,例如,通过transactionManager属性的@Transactional声明。spring-doc.cadn.net.cn

下图显示了在事务代理上调用方法的概念视图:spring-doc.cadn.net.cn

TX