Spring 通过一个精密且强大的机制来处理不同的事务传播行为和隔离级别,其核心是面向切面编程 (AOP)、平台事务管理器 (PlatformTransactionManager) 和 事务同步管理器 (TransactionSynchronizationManager) 的协同工作。
Spring 事务处理的核心架构
当 Spring 容器检测到一个 bean 中有 @Transactional 注解时,它不会直接返回该 bean 的实例,而是创建一个代理对象。 所有对该 bean 中带有 @Transactional 注解的方法的调用都会被这个代理拦截,从而进入事务处理的流程。
这个流程的主要参与者包括:
- AOP 代理 (AOP Proxy):这是事务管理的入口。它拦截方法调用,并启动事务管理的逻辑。
- 事务拦截器 (
TransactionInterceptor): 作为 AOP 的具体实现,它在方法执行前后添加事务处理逻辑,例如开始事务、提交或回滚。 - 平台事务管理器 (
PlatformTransactionManager): 这是 Spring 事务管理的核心接口,定义了获取、提交和回滚事务等基本操作。 Spring 为不同的持久化技术(如 JDBC, JPA, Hibernate)提供了具体的实现。 事务行为的实际执行者是PlatformTransactionManager。 - 事务同步管理器 (
TransactionSynchronizationManager): 这是一个关键的工具类,它使用ThreadLocal变量来管理和同步当前线程的事务资源(如数据库连接)和状态(如是否存在激活的事务)。 这确保了在同一个线程中的事务操作能够正确协调。
事务传播行为的实现
事务传播行为定义了当一个事务方法被另一个事务方法调用时,事务应该如何表现。 这是通过 PlatformTransactionManager 的 getTransaction() 方法,并结合 TransactionSynchronizationManager 来实现的。
以下是关键传播行为的实现流程:
-
方法调用与拦截: 当一个被
@Transactional注解的方法被调用时,AOP 代理会拦截该调用。 -
获取事务:
TransactionInterceptor会调用PlatformTransactionManager的getTransaction()方法来获取一个事务状态对象。 -
判断当前事务状态:
PlatformTransactionManager的实现类会首先通过TransactionSynchronizationManager.isActualTransactionActive()来检查当前线程是否已经存在一个激活的事务。 -
根据传播行为决策:
REQUIRED(默认): 如果当前存在事务,则直接加入该事务,共享同一个物理连接。如果没有,则创建一个新的事务。REQUIRES_NEW: 无论当前是否存在事务,都会创建一个全新的事务。如果当前已有事务,PlatformTransactionManager会先将当前事务挂起(暂停),然后创建一个拥有独立连接的新事务。当新事务结束后,再恢复之前被挂起的事务。NESTED: 如果当前存在事务,并且底层的事务管理器支持保存点(Savepoint),它会创建一个保存点。内部的嵌套事务可以独立于外部事务进行回滚,而不会影响到外部事务。如果没有活动事务,其行为与REQUIRED相同。SUPPORTS: 如果当前存在事务,则加入;如果没有,则以非事务方式执行。NOT_SUPPORTED: 总是以非事务方式执行。如果当前存在事务,会将其挂起。MANDATORY: 强制要求当前必须存在一个事务,否则会抛出异常。NEVER: 强制要求当前不能存在事务,否则会抛出异常。
隔离级别的实现
事务隔离级别定义了一个事务中的修改对其他并发事务的可见性。 隔离级别的设置发生在创建 新 事务的时候。
-
设置时机: 隔离级别的信息包含在事务定义中。当
PlatformTransactionManager开始一个新事务时(例如,对于REQUIRED传播行为且当前无事务,或对于REQUIRES_NEW),它会将指定的隔离级别应用到底层资源上。 -
具体实现:
- 对于使用 JDBC 的情况(如
DataSourceTransactionManager),在获取一个新的数据库连接后,会调用connection.setTransactionIsolation(isolationLevel)方法来设置该连接的隔离级别。 - 当隔离级别设置为
DEFAULT时,Spring 会使用数据库驱动或数据源配置的默认隔离级别。
- 对于使用 JDBC 的情况(如
-
重要提示: 隔离级别只在开启新事务时才生效。如果一个方法加入了已有的事务(例如,
REQUIRED传播行为),它将沿用现有事务的隔离级别,而其自身设定的隔离级别将被忽略。
总结
Spring 通过 AOP 代理拦截事务性方法调用,利用 PlatformTransactionManager 作为策略接口来执行具体的事务操作,并借助 TransactionSynchronizationManager 在线程级别上管理事务状态和资源。这种设计将复杂的事务控制逻辑与业务代码解耦,使得开发者可以通过简单的 @Transactional 注解来灵活地控制事务的传播行为和隔离级别,从而构建出稳定、可靠的应用程序。
867



被折叠的 条评论
为什么被折叠?



