0
点赞
收藏
分享

微信扫一扫

如何在 Spring Boot 中配置事务管理?

🏆本文收录于「滚雪球学SpringBoot」专栏,手把手带你零基础入门springboot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 

前言

在开发企业级应用时,事务管理是必不可少的。事务确保了数据库操作的一致性和可靠性,能够保证一组操作要么全部成功,要么全部失败。在 Spring Boot 中,事务管理不仅简化了数据库操作的管理,还支持声明式和编程式事务管理,使得事务的管理更加灵活和易于维护。

本文将介绍如何在 Spring Boot 中配置事务管理,涵盖以下内容:

  • Spring Boot 中事务管理的配置:如何配置 Spring Boot 中的事务管理。
  • 使用 @Transactional 注解管理事务:如何通过 @Transactional 注解实现方法级别的事务管理。
  • 声明式事务管理和编程式事务管理:如何使用 PlatformTransactionManager 进行编程式事务管理。
  • 代码示例:展示如何在 Spring Boot 中配置和管理事务。

概述:Spring Boot 中事务管理的配置

Spring 提供了两种主要的事务管理方式:

  1. 声明式事务管理:通过 @Transactional 注解或者 XML 配置文件来管理事务,Spring 会自动为方法生成事务代理。
  2. 编程式事务管理:通过 PlatformTransactionManager 编程方式管理事务,适用于需要手动控制事务的场景。

Spring Boot 默认使用声明式事务管理,但你也可以使用编程式事务管理来实现更加灵活的事务控制。

使用 @Transactional 注解管理事务

@Transactional 注解是 Spring 提供的声明式事务管理的核心注解。通过在类或者方法上添加 @Transactional 注解,可以自动管理事务的提交、回滚等操作。

1. 启用事务管理

在 Spring Boot 中,事务管理通过 @EnableTransactionManagement 注解启用,但通常 Spring Boot 会自动启用事务管理,无需显式配置。只需要在启动类或者配置类中添加 @SpringBootApplication@Configuration 注解即可。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

Spring Boot 会自动配置 DataSource 和事务管理器(如 JpaTransactionManager)。

2. 使用 @Transactional 注解

@Transactional 注解用于指定一个方法或类是一个事务。你可以将它添加到服务类或者方法上,Spring 会在执行该方法时自动开启事务,执行成功后自动提交事务,出现异常时自动回滚。

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Transactional  // 开启事务
    public void addUser(String username) {
        // 执行数据库操作,如插入数据
        userRepository.save(new User(username));
        
        // 可能的业务逻辑
        // 如果发生异常,事务会被回滚
    }
}

在上面的例子中,addUser 方法被 @Transactional 注解标注,这意味着这个方法执行时会自动管理事务。如果该方法执行过程中抛出异常,Spring 会自动回滚该事务,保证数据的一致性。

3. 事务的回滚和提交

默认情况下,只有 运行时异常(RuntimeException 会导致事务回滚。如果你希望其他异常(例如检查型异常)也触发回滚,可以通过 @Transactional 注解的 rollbackFor 属性进行配置。

@Transactional(rollbackFor = Exception.class)  // 配置所有异常都会触发事务回滚
public void addUser(String username) {
    userRepository.save(new User(username));
    // 其他业务逻辑
}

如果只想回滚某种类型的异常,可以使用 rollbackFornoRollbackFor 属性指定具体异常类型。

声明式事务管理与编程式事务管理

除了声明式事务管理外,Spring 还支持 编程式事务管理,通过 PlatformTransactionManager 进行手动管理。这种方式适用于需要更加灵活控制事务的场景,比如需要在方法中动态决定是否开启事务、手动提交和回滚事务等。

1. 使用 PlatformTransactionManager 进行编程式事务管理

PlatformTransactionManager 是 Spring 的核心接口,用于管理事务的提交、回滚和状态查询。你可以在服务中通过 PlatformTransactionManager 来手动管理事务。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

@Service
public class UserService {

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Autowired
    private UserRepository userRepository;

    public void addUserWithTransaction(String username) {
        // 开始事务
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setName("MyTransaction");
        def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            // 执行业务逻辑
            userRepository.save(new User(username));
            // 提交事务
            transactionManager.commit(status);
        } catch (Exception e) {
            // 出现异常时回滚事务
            transactionManager.rollback(status);
            throw e;
        }
    }
}

在这个示例中:

  • 我们使用 PlatformTransactionManager 获取一个事务状态(TransactionStatus)。
  • 如果业务逻辑执行成功,调用 transactionManager.commit(status) 提交事务。
  • 如果出现异常,则调用 transactionManager.rollback(status) 回滚事务。
2. 配置事务管理器

Spring Boot 默认配置了合适的事务管理器(例如 JpaTransactionManager),但如果你需要使用其他类型的事务管理器(例如针对 JDBCDataSourceTransactionManager),你可以通过配置类来显式指定。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
public class TransactionConfig {

    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

代码示例:配置和管理事务

以下是一个完整的示例,展示如何在 Spring Boot 中使用 @Transactional 注解进行事务管理,并结合编程式事务管理控制事务的提交和回滚。

1. application.properties 配置数据源
spring.datasource.url=jdbc:mysql://localhost:3306/testdb
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect
2. 服务类使用 @Transactional 注解
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional  // 启用事务
    public void addUser(String username) {
        userRepository.save(new User(username));
        // 其他操作,若出现异常则回滚事务
    }
}
3. 编程式事务管理
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

@Service
public class UserService {

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Autowired
    private UserRepository userRepository;

    public void addUserWithTransaction(String username) {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        def.setName("MyTransaction");
        def.setPropagationBehavior(DefaultTransactionDefinition.PROPAGATION_REQUIRED);
        TransactionStatus status = transactionManager.getTransaction(def);

        try {
            userRepository.save(new User(username));
            transactionManager.commit(status);  // 提交事务
        } catch (Exception e) {
            transactionManager.rollback(status);  // 回滚事务
            throw e;
        }
    }
}

总结

在 Spring Boot 中配置事务管理非常简单,可以通过以下两种方式进行事务管理:

  1. 声明式事务管理:通过 @Transactional 注解轻松实现方法级别的事务控制。
  2. 编程式事务管理:使用 PlatformTransactionManager 来手动管理事务,适用于需要精细控制事务的场景。

通过这两种方式,Spring Boot 为我们提供了灵活、强大的事务管理支持,可以轻松确保数据库操作的一致性和可靠性。

🧧福利赠与你🧧

  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学SpringBoot」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门SpringBoot,就像滚雪球一样,越滚越大, 无边无际,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

✨️ Who am I?

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,掘金等各大社区平台签约作者,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 30w+;更多精彩福利点击[这里];硬核微信公众号[「猿圈奇妙屋」],欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。

<div align="center"><img width="780" height="" src="https://i-blog.csdnimg.cn/direct/f7f3d1c620174b5ebd4d74b7255a33ad.png"/></div>

-End-

举报

相关推荐

0 条评论