@Transactional
是 Spring 中用于声明式事务管理的核心注解,它的背后是 Spring AOP(面向切面编程)+ 事务管理器的协作。
下面我将从源码层面梳理 @Transactional
的执行流程和关键类:
🔧 一、@Transactional
注解源码
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface Transactional {
Propagation propagation() default Propagation.REQUIRED;
Isolation isolation() default Isolation.DEFAULT;
int timeout() default -1;
boolean readOnly() default false;
Class<? extends Throwable>[] rollbackFor() default {};
String value() default "";
// ... 还有 rollbackForClassName, noRollbackFor 等
}
⚙️ 二、关键执行流程(核心类)
Spring 对 @Transactional
的处理主要分为以下几个步骤:
1. 注解的解析器
-
类:
TransactionAnnotationParser
-
实现:
SpringTransactionAnnotationParser
负责读取注解属性,如传播行为、是否只读、rollback 条件等。
2. 事务属性提取器
-
类:
TransactionAttributeSource
-
默认实现:
AnnotationTransactionAttributeSource
根据方法/类上的 @Transactional
注解,生成 TransactionAttribute
(事务属性对象)
3. 事务拦截器(核心逻辑)
-
类:
TransactionInterceptor
(事务增强器)
这是一个 AOP 拦截器,实现了 MethodInterceptor
接口。
核心代码:
public Object invoke(MethodInvocation invocation) throws Throwable {
// 获取目标方法的事务属性
TransactionAttribute txAttr = getTransactionAttributeSource().getTransactionAttribute(method, targetClass);
// 获取 PlatformTransactionManager
PlatformTransactionManager tm = determineTransactionManager(txAttr);
// 创建事务,执行业务逻辑,提交/回滚事务
return createTransactionIfNecessary(tm, txAttr, joinpointIdentification, invocation::proceed);
}
4. 事务管理器
-
接口:
PlatformTransactionManager
-
实现:
-
DataSourceTransactionManager
(JDBC) -
JpaTransactionManager
(JPA) -
HibernateTransactionManager
(Hibernate)
-
这是实际控制事务开始、提交、回滚的对象。
5. 注册过程
Spring 在启动时通过 @EnableTransactionManagement
触发自动配置:
-
类:
TransactionManagementConfigurationSelector
-
会注册:
-
ProxyTransactionManagementConfiguration
-
包含
TransactionInterceptor
-
通过
BeanFactoryTransactionAttributeSourceAdvisor
织入到目标 Bean 中
-
-
🔍 简化版执行流程图:
@Target: @Transactional
↓
TransactionAnnotationParser
↓
AnnotationTransactionAttributeSource
↓
TransactionInterceptor(AOP切面)
↓
PlatformTransactionManager
↓
调用真实方法(业务代码)
↓
成功提交 / 异常回滚
🔁 示例解析
@Service
public class OrderService {
@Transactional
public void createOrder() {
// 1. 创建订单