@Transaction事务注解

@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. 创建订单
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值