spring @Transactional 是怎么实现事务的

Spring的 @Transactional 注解通过Spring的事务管理机制实现事务控制。这个机制主要依赖于Spring的AOP(面向切面编程)和事务管理器(Transaction Manager)。下面是 @Transactional 实现事务的详细过程:

1. 基本概念

  • AOP(面向切面编程):Spring使用AOP来拦截方法调用,并在方法调用前后执行一些额外的逻辑,如事务管理。

  • 事务管理器(Transaction Manager):Spring提供多种事务管理器,如 DataSourceTransactionManagerJpaTransactionManager 等,用于管理事务的创建、提交和回滚。

2. 实现步骤

2.1 配置事务管理器

首先,需要在Spring配置中定义一个事务管理器。通常在Spring Boot中,这可以通过配置文件自动完成,但在某些情况下,你可能需要手动配置。

@Configuration
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}
2.2 启用事务管理

在Spring Boot应用中,通常不需要显式启用事务管理,因为Spring Boot会自动配置。但在某些情况下,你可能需要使用 @EnableTransactionManagement 注解。

@SpringBootApplication
@EnableTransactionManagement
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}
2.3 使用 @Transactional 注解

在需要事务管理的方法上添加 @Transactional 注解。

@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    @Transactional
    public void performTransaction() {
        // 一些数据库操作
        myRepository.save(new MyEntity());
        
        // 如果发生异常,事务会回滚
        if (somethingWentWrong) {
            throw new RuntimeException("Something went wrong");
        }
    }
}

3. 工作原理

3.1 创建代理对象

当Spring容器启动时,会为所有带有 @Transactional 注解的Bean创建一个代理对象。这个代理对象会在目标方法调用前后插入事务管理的逻辑。

3.2 拦截方法调用

当调用带有 @Transactional 注解的方法时,实际上是调用代理对象的方法。代理对象会在方法调用前后执行以下步骤:

  1. 开启事务:在方法调用前,代理对象会通过事务管理器开启一个新的事务。

  2. 执行目标方法:调用实际的目标方法。

  3. 提交或回滚事务

    • 如果目标方法执行成功且没有异常,代理对象会通过事务管理器提交事务。

    • 如果目标方法抛出异常,代理对象会通过事务管理器回滚事务。

3.3 异常处理

默认情况下,@Transactional 注解会对 RuntimeException 和 Error 进行回滚。你可以通过 rollbackFor 和 noRollbackFor 属性自定义回滚行为。

@Transactional(rollbackFor = Exception.class)
public void performTransaction() {
    // 方法实现
}

4. 注意事项

spring事务什么时候会失效-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值