对于最新稳定版本,请使用 Spring Framework 7.0.6spring-doc.cadn.net.cn

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

仅仅告诉您在类上添加 @Transactional 注解,并在配置中加入 @EnableTransactionManagement,然后就期望您理解其全部工作原理,这是远远不够的。为了提供更深入的理解,本节将在事务相关问题的上下文中,解释 Spring 框架声明式事务基础设施的内部工作机制。spring-doc.cadn.net.cn

关于 Spring 框架的声明式事务支持,最重要的概念在于:该支持是通过 AOP 代理启用的,并且事务性通知由元数据(目前基于 XML 或注解)驱动。AOP 与事务元数据相结合,生成一个 AOP 代理,该代理使用 TransactionInterceptor 并结合适当的 TransactionManager 实现,在方法调用周围驱动事务。spring-doc.cadn.net.cn

Spring AOP 在AOP 章节中有详细介绍。

Spring Framework 的 TransactionInterceptor 为命令式和响应式编程模型提供事务管理。该拦截器通过检查方法的返回类型来判断所需的事务管理风格。返回响应式类型(例如 Publisher 或 Kotlin Flow,或它们的子类型)的方法适用于响应式事务管理。所有其他返回类型(包括 void)则使用命令式事务管理的代码路径。spring-doc.cadn.net.cn

事务管理风格会影响所需事务管理器的类型。命令式事务需要使用 PlatformTransactionManager,而响应式事务则使用 ReactiveTransactionManager 的实现。spring-doc.cadn.net.cn

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

ReactiveTransactionManager 管理的响应式事务使用 Reactor 上下文(context) 而非线程局部(thread-local)属性。因此,所有参与的数据访问操作都必须在同一个响应式管道(reactive pipeline)中的相同 Reactor 上下文内执行。spring-doc.cadn.net.cn

以下图片展示了调用事务代理对象的方法的概念视图:spring-doc.cadn.net.cn

tx