对于最新的稳定版本,请使用 Spring Framework 7.0.6!spring-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 上下文而不是线程局部属性。因此,所有参与的数据访问操作都需要在同一响应式管道的相同 Reactor 上下文中执行。spring-doc.cadn.net.cn

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

tx