@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 | 事务管理入口 |
|
TransactionDefinition | 定义事务属性 | 封装隔离级别/传播行为/超时等 |
TransactionStatus | 事务运行时状态 | 包含是否新事务/回滚标记等 |
TransactionAttributeSource | 解析事务注解 |
|
三、事务传播行为实现
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 | 配置 |
非public方法 | Spring代理限制 | 改为public方法 |
多线程调用 | ThreadLocal隔离失效 | 避免跨线程事务操作 |
2. 性能优化建议
- 合理设置事务边界:避免在事务中执行远程调用或IO操作
- 使用只读事务:
@Transactional(readOnly=true)
- 控制事务超时:
@Transactional(timeout=5)
- 避免大事务:拆分长事务为多个小事务
七、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();}
}
关键自动配置点:
- 自动检测
PlatformTransactionManager
实现 - 根据依赖自动配置 JDBC/JPA/JTA 事务管理器
- 自动启用
@EnableTransactionManagement
总结
Spring @Transactional
的实现核心在于:
- 动态代理:通过 AOP 在运行时增强事务处理
- 事务管理器:抽象事务操作接口,支持多种实现
- 传播行为:通过事务挂起/恢复实现嵌套事务
- 资源同步:使用 ThreadLocal 管理事务上下文
- 异常处理:基于异常类型决定回滚策略
理解这些原理有助于:
- 正确使用事务传播行为
- 诊断事务相关问题
- 优化事务性能
- 实现复杂事务场景