Spring Boot事务管理?你了解吗

举报
bug菌 发表于 2025/04/27 09:47:18 2025/04/27
【摘要】 🏆本文收录于「滚雪球学SpringBoot」专栏(全网一个名),手把手带你零基础入门Spring Boot,从入门到就业,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8 前言在本节中,我们将探讨Spring Boot中的事务管理。事务是保证...

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

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

前言

在本节中,我们将探讨Spring Boot中的事务管理。事务是保证数据一致性和可靠性的关键部分,它能够确保一系列操作在成功时完全执行,或在失败时完全回滚。Spring Boot提供了强大的事务管理功能,能够帮助我们更轻松地管理数据库的操作。我们将详细讲解事务的概念、配置方式以及如何使用@Transactional注解来实现事务控制。


一、事务的概念与配置

1.1 什么是事务?

事务(Transaction)是指一组操作的集合,这些操作要么全部执行成功,要么全部失败回滚。事务确保了数据库操作的原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability),这四个特性被称为ACID特性。

  • 原子性:事务中的操作要么全部成功,要么全部失败,不会有部分操作成功。
  • 一致性:事务的执行必须使数据库从一个一致性状态转变到另一个一致性状态。
  • 隔离性:一个事务的执行不应该受到其他事务的干扰。
  • 持久性:一旦事务提交,对数据库的修改就是永久性的。

1.2 Spring Boot的事务管理

Spring Boot通过@Transactional注解来管理事务。Spring Boot使用Spring的事务管理机制,能够支持声明式事务管理,并且提供了配置选项来指定事务的传播行为、隔离级别等。

1.2.1 事务的传播行为

Spring支持七种不同的事务传播行为,控制事务之间的关系。常用的传播行为有:

  • REQUIRED:如果当前没有事务,则创建一个新的事务;如果当前存在事务,则加入到这个事务中。
  • REQUIRES_NEW:无论当前是否有事务,都会新建一个事务,当前事务会被挂起。
  • NESTED:如果当前没有事务,则创建一个新的事务;如果当前有事务,则在当前事务中嵌套执行。

1.2.2 事务的隔离级别

事务的隔离级别决定了一个事务内的数据对其他事务的可见性。常用的隔离级别有:

  • READ_UNCOMMITTED:最低的隔离级别,允许读取未提交的数据,可能会导致脏读。
  • READ_COMMITTED:允许读取已提交的数据,避免脏读,但可能导致不可重复读。
  • REPEATABLE_READ:保证在事务执行期间读取的数据是一致的,避免了不可重复读,但可能会导致幻读。
  • SERIALIZABLE:最高的隔离级别,事务完全串行化执行,避免了所有并发问题,但性能较差。

🛠️ 二、如何配置Spring Boot事务

2.1 启用事务管理

Spring Boot通过@EnableTransactionManagement注解启用声明式事务管理,但默认情况下,Spring Boot已经自动配置了事务管理,因此你无需手动配置启用事务管理。

你可以通过在配置类上使用@EnableTransactionManagement注解来启用它:

import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class TransactionConfig {
    // 自定义事务管理配置
}

Spring Boot默认的事务管理器是PlatformTransactionManager,适用于大多数数据库。

2.2 配置数据库事务属性

application.properties文件中,你可以配置Spring Boot的数据源以及事务管理相关的属性。例如:

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=rootpassword
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver

# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# 事务隔离级别配置
spring.transaction.isolation=REPEATABLE_READ

通过这种方式,我们不仅配置了数据库连接,还设置了事务的隔离级别。


🏷️ 三、使用@Transactional注解

@Transactional注解是Spring Boot中管理事务的核心。你可以将这个注解应用到类上或者方法上,指定哪些方法需要事务控制。

3.1 在方法上使用@Transactional

当你在一个方法上添加@Transactional注解时,Spring会自动为该方法开启事务,并在方法执行结束时提交事务,或者在发生异常时回滚事务。

3.1.1 示例:基本事务管理

package com.example.demo.service;

import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
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 User createUser(User user) {
        // 进行一些数据库操作
        return userRepository.save(user);
    }
}

在上述代码中,createUser方法被@Transactional注解标记。Spring会在调用此方法时启动一个事务。如果方法执行没有发生异常,事务会被提交;如果发生异常,事务会被回滚。

3.1.2 示例:事务回滚

Spring默认会在遇到运行时异常(RuntimeException及其子类)时进行回滚。如果需要自定义回滚规则,可以通过@TransactionalrollbackFor属性来设置。

@Transactional(rollbackFor = Exception.class)
public void someTransactionalMethod() throws Exception {
    // 进行一些数据库操作
    if (someConditionFails) {
        throw new Exception("Something went wrong");
    }
}

这样,所有类型的异常都会触发事务回滚。

3.1.3 事务的传播行为与隔离级别

你可以为@Transactional指定不同的传播行为和隔离级别。示例如下:

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED)
public void someMethod() {
    // 执行数据库操作
}
  • propagation = Propagation.REQUIRED表示如果当前存在事务,则加入当前事务,否则新建一个事务。
  • isolation = Isolation.READ_COMMITTED表示事务的隔离级别为READ_COMMITTED,即避免脏读。

3.2 在类上使用@Transactional

如果一个类中的所有方法都需要事务管理,你可以将@Transactional注解放在类上,这样该类中的所有公共方法都会启用事务。

@Transactional
@Service
public class UserService {
    
    @Autowired
    private UserRepository userRepository;
    
    public User createUser(User user) {
        return userRepository.save(user);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}

在这个例子中,UserService类中的所有方法都自动具有事务功能。


🧑‍🔬 四、事务的最佳实践

4.1 只在需要事务的地方使用事务

不必要的事务会增加系统的复杂性和性能开销,因此最好只在需要保证数据一致性的操作中使用事务。

4.2 使用合适的传播行为和隔离级别

  • 传播行为:根据操作的复杂性和不同服务之间的依赖关系选择合适的传播行为。
  • 隔离级别:根据数据库操作的并发性选择合适的隔离级别。比如,READ_COMMITTED适用于大多数常见的数据库操作,但对于一些复杂的业务场景,可能需要SERIALIZABLE来防止并发问题。

4.3 小心长事务

长时间运行的事务可能会导致锁竞争和性能问题。确保事务的执行时间尽可能短,避免在事务内进行过多的操作或复杂的计算。


🎉 总结

在这篇文章中,我们详细介绍了Spring Boot事务管理的概念和配置方法,深入讲解了@Transactional注解的使用。通过合理配置传播行为、隔离级别以及回滚规则,我们可以在Spring Boot中高效、安全地管理事务。希望这篇文章能够帮助你更好地理解事务的运作机制,提升你的应用开发能力。

事务管理是确保应用数据一致性和可靠性的关键,掌握它能帮助你开发更加健壮、可维护的系统。

🧧福利赠与你🧧

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

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

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

✨️ Who am I?

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

-End-

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。