@Transactional 是 Spring 框架中实现声明式事务管理的核心注解,其底层实现涉及多个关键组件和技术,下面我将详细解析其工作原理。

一、核心实现机制

1. AOP 动态代理

Spring 使用 AOP(面向切面编程) 技术实现事务管理:

  • 当类或方法添加 @Transactional 时,Spring 会创建代理对象
  • 代理对象在方法调用前后添加事务处理逻辑
  • 代理方式:
  • JDK 动态代理:针对实现接口的类(默认方式)
  • CGLIB 代理:针对没有接口的类(需开启 proxy-target-class=true
// 原始 Bean
public class UserService {@Transactionalpublic void createUser(User user) {// 业务逻辑}
}// Spring 创建的代理对象
public class UserService$$EnhancerBySpringCGLIB extends UserService {private UserService target;@Overridepublic void createUser(User user) {// 1. 开启事务// 2. 调用 target.createUser(user)// 3. 提交或回滚事务}
}

2. 事务拦截器链

核心拦截器 TransactionInterceptor 处理事务逻辑:

public class TransactionInterceptor extends TransactionAspectSupport implements MethodInterceptor {public Object invoke(MethodInvocation invocation) throws Throwable {// 获取事务属性TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(invocation.getMethod(), invocation.getThis().getClass());// 获取事务管理器PlatformTransactionManager tm = determineTransactionManager(txAttr);// 执行带事务管理的方法return invokeWithinTransaction(invocation.getMethod(), invocation.getThis().getClass(), new InvocationCallback() {public Object proceedWithInvocation() throws Throwable {return invocation.proceed();}});}
}

二、关键组件协作

事务处理流程图

graph TDA[调用@Transactional方法] --> B(动态代理拦截)B --> C{是否存在事务}C -->|是| D[根据传播行为处理]C -->|否| E[创建新事务]E --> F[设置隔离级别/超时/只读]F --> G[执行目标方法]G --> H{是否异常}H -->|是| I[回滚事务]H -->|否| J[提交事务]

核心组件说明

组件

作用

实现类示例

TransactionManager

事务管理入口

DataSourceTransactionManagerJpaTransactionManager

TransactionDefinition

定义事务属性

封装隔离级别/传播行为/超时等

TransactionStatus

事务运行时状态

包含是否新事务/回滚标记等

TransactionAttributeSource

解析事务注解

AnnotationTransactionAttributeSource

三、事务传播行为实现

Spring 支持 7 种传播行为,以下是关键实现逻辑:

1. REQUIRED(默认)

if (isExistingTransaction(transaction)) {// 加入当前事务return prepareTransactionStatus(transaction, false);
} else {// 创建新事务return startTransaction(definition);
}

2. REQUIRES_NEW

// 挂起当前事务(如果存在)
SuspendedResourcesHolder suspendedResources = suspend(transaction);
try {// 总是创建新事务return startTransaction(definition);
} catch (Throwable ex) {// 异常时恢复挂起的事务resume(transaction, suspendedResources);throw ex;
}

3. NESTED

if (isExistingTransaction(transaction)) {// 创建保存点Object savepoint = transaction.createSavepoint();return prepareTransactionStatus(transaction, false, true, savepoint);
} else {// 创建新事务return startTransaction(definition);
}

四、事务关键处理流程

1. 事务开启阶段

protected TransactionInfo createTransactionIfNecessary(PlatformTransactionManager tm, TransactionAttribute txAttr, String joinpointIdentification) {TransactionStatus status = null;if (txAttr != null) {// 获取事务(根据传播行为)status = tm.getTransaction(txAttr);}// 绑定事务信息到ThreadLocalreturn prepareTransactionInfo(tm, txAttr, joinpointIdentification, status);
}

2. 异常回滚处理

protected void completeTransactionAfterThrowing(TransactionInfo txInfo, Throwable ex) {if (txInfo != null && txInfo.getTransactionStatus() != null) {// 检查是否需要回滚if (txInfo.transactionAttribute.rollbackOn(ex)) {try {txInfo.getTransactionManager().rollback(txInfo.getTransactionStatus());} catch (TransactionSystemException ex2) {// 记录日志}} else {// 提交事务(针对检查型异常)txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());}}
}

3. 事务提交

protected void commitTransactionAfterReturning(TransactionInfo txInfo) {if (txInfo != null && txInfo.getTransactionStatus() != null) {// 提交事务(内部会检查是否为新事务)txInfo.getTransactionManager().commit(txInfo.getTransactionStatus());}
}

五、事务同步与ThreadLocal

Spring 使用 TransactionSynchronizationManager 管理事务资源:

public abstract class TransactionSynchronizationManager {// 使用ThreadLocal保存事务上下文private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources");private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations");private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name");private static final ThreadLocal<Boolean> currentTransactionReadOnly = new NamedThreadLocal<>("Current transaction read-only status");private static final ThreadLocal<Integer> currentTransactionIsolationLevel = new NamedThreadLocal<>("Current transaction isolation level");private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal<>("Actual transaction active");
}

六、常见问题与解决方案

1. 事务失效场景

场景

原因

解决方案

自调用

调用同类中@Transactional方法

通过AopContext获取代理对象

异常类型不匹配

默认只回滚RuntimeException

配置@Transactional(rollbackFor=Exception.class)

非public方法

Spring代理限制

改为public方法

多线程调用

ThreadLocal隔离失效

避免跨线程事务操作

2. 性能优化建议

  1. 合理设置事务边界:避免在事务中执行远程调用或IO操作
  2. 使用只读事务@Transactional(readOnly=true)
  3. 控制事务超时@Transactional(timeout=5)
  4. 避免大事务:拆分长事务为多个小事务

七、Spring Boot 自动配置

Spring Boot 通过 TransactionAutoConfiguration 自动配置事务:

@Configuration
@ConditionalOnClass(PlatformTransactionManager.class)
@AutoConfigureAfter({ JtaAutoConfiguration.class, HibernateJpaAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class })
@EnableConfigurationProperties(TransactionProperties.class)
public class TransactionAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic TransactionManagerCustomizers platformTransactionManagerCustomizers() {return TransactionManagerCustomizers.of();}@Bean@ConditionalOnMissingBean(AbstractTransactionManagementConfiguration.class)public EnableTransactionManagementConfiguration enableTransactionManagementConfiguration() {return new EnableTransactionManagementConfiguration();}
}

关键自动配置点:

  1. 自动检测 PlatformTransactionManager 实现
  2. 根据依赖自动配置 JDBC/JPA/JTA 事务管理器
  3. 自动启用 @EnableTransactionManagement

总结

Spring @Transactional 的实现核心在于:

  1. 动态代理:通过 AOP 在运行时增强事务处理
  2. 事务管理器:抽象事务操作接口,支持多种实现
  3. 传播行为:通过事务挂起/恢复实现嵌套事务
  4. 资源同步:使用 ThreadLocal 管理事务上下文
  5. 异常处理:基于异常类型决定回滚策略

理解这些原理有助于:

  • 正确使用事务传播行为
  • 诊断事务相关问题
  • 优化事务性能
  • 实现复杂事务场景