Spring Boot原理分析(四):声明式事务

这篇具有很好参考价值的文章主要介绍了Spring Boot原理分析(四):声明式事务。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、Spring事务管理方式及其实现

Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。下面分别介绍这两种方式及其实现方式:

1. 编程式事务管理

编程式事务管理是通过编写代码来手动管理事务。它需要在事务的开始和结束时,通过编程方式来控制事务的提交和回滚。Spring 提供了 PlatformTransactionManager 接口来实现编程式事务管理。通过该接口,我们可以手动管理事务的开始、提交和回滚等操作。

以下是一个简单的编程式事务管理的示例代码:

@Autowired
private PlatformTransactionManager transactionManager;

public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
    TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());
    try {
        fromAccount.withdraw(amount);
        toAccount.deposit(amount);
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        throw e;
    }
}

在上述示例中,我们使用 PlatformTransactionManager 接口实现了编程式事务管理。在 transferMoney() 方法中,我们手动管理了事务的开始、提交和回滚等操作。

2. 声明式事务管理

Spring 提供了多种声明式事务管理的方式,包括基于 XML 配置文件、基于注解和基于 Java 配置类等方式。

Spring 基于注解的声明式事务实现,可以通过在方法上添加事务注解来指定事务的属性和行为。Spring 提供了多个事务注解,包括 @Transactional@Rollback@Commit 等。其中,@Transactional 注解是最常用的事务注解,用于标识需要进行事务管理的方法。

以下是一个基于注解的声明式事务实现的示例代码:

    @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)
    public void transferMoney(Account fromAccount, Account toAccount, BigDecimal amount) {
        fromAccount.withdraw(amount);
        toAccount.deposit(amount);
        accountDao.update(fromAccount);
        accountDao.update(toAccount);
    }

基于注解的声明式事务实现可以更加方便地管理事务,避免了手动管理事务的繁琐和出错的可能性。同时,它也提高了代码的可读性和可维护性。

总之,Spring 提供了多种管理事务的方式,包括编程式事务管理和声明式事务管理两种方式。编程式事务管理需要手动管理事务的开始、提交和回滚等操作,而声明式事务管理则是通过在配置文件中声明事务规则,来自动管理事务。通过选择适合自己的方式,可以更加方便地实现事务管理。

二、@Transactional详解

@Transactional 是 Spring Framework 中最常用的事务注解之一,它可以用来标识需要进行事务管理的方法或类。@Transactional 注解可以指定事务的传播行为、隔离级别、超时时间、只读属性、回滚规则等属性。以下是对 @Transactional 注解的详细解析:

 @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class)

1. 属性:事务传播行为(Propagation)

Spring 中的事务传播行为(Propagation)指的是多个事务之间的相互影响关系,即在一个事务方法调用另一个事务方法时,这两个事务方法之间的关系。

Spring Framework 中定义了 7 种事务传播行为,分别为:

  • Propagation.REQUIRED:默认值,如果当前存在事务,则加入该事务,否则创建一个新事务。
  • Propagation.SUPPORTS:如果当前存在事务,则加入该事务,否则以非事务方式执行。
  • Propagation.MANDATORY:如果当前存在事务,则加入该事务,否则抛出异常。
  • Propagation.REQUIRES_NEW:创建一个新事务,并挂起当前事务(如果存在)。
  • Propagation.NOT_SUPPORTED:以非事务方式执行,并挂起当前事务(如果存在)。
  • Propagation.NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  • Propagation.NESTED:如果当前存在事务,则在嵌套事务中执行,否则创建一个新事务。

2. 属性:事务隔离级别(Isolation)

事务隔离级别指的是多个事务之间的数据隔离程度。Spring Framework 中定义了 5 种事务隔离级别,分别为:

  • Isolation.DEFAULT:使用数据库的默认隔离级别。
  • Isolation.READ_UNCOMMITTED:最低的隔离级别,允许读取未提交的数据。
  • Isolation.READ_COMMITTED:允许读取已提交的数据。
  • Isolation.REPEATABLE_READ:保证在同一事务中多次读取同一数据时,得到的结果是一致的。
  • Isolation.SERIALIZABLE:最高的隔离级别,完全禁止不可重复读和幻读。

3. 属性:事务超时时间(timeout)

事务超时时间指的是事务执行所允许的最大时间。如果事务执行时间超过了指定的超时时间,则事务会被回滚。超时时间的单位为秒,默认值为 -1,表示永不超时。

4. 属性:只读属性(readOnly)

只读属性指的是事务是否只读。如果将事务设置为只读,那么在事务执行期间,所有对数据库的修改操作都会被禁止。只读属性可以提高事务的并发性能。

5. 属性:回滚规则(rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName)

回滚规则指的是哪些异常会导致事务回滚。可以使用 rollbackFornoRollbackForrollbackForClassNamenoRollbackForClassName 等属性来指定回滚规则。其中,rollbackFornoRollbackFor 属性用于指定需要回滚或不需要回滚的异常类型,而 rollbackForClassNamenoRollbackForClassName 属性用于指定需要回滚或不需要回滚的异常类名。

以上是 @Transactional 注解的常用属性和含义。需要注意的是,在使用 @Transactional 注解时,必须要将它所在的类或接口注册为 Spring Bean,且 @Transactional 注解只对 public 方法生效。文章来源地址https://www.toymoban.com/news/detail-583012.html

到了这里,关于Spring Boot原理分析(四):声明式事务的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot原理分析 | SpringApplication、Yaml、Properties

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Spring开源框架,轻量级的Java开发框架,解决企业级应用开发的复杂性而创建,简化开发 基于POJO的轻量级和最小侵入型编程 通过IOC,依赖注入(DI)和面向接口实现松耦合 基于切面(AOP)和惯例进行声明式编程 通过切

    2024年02月12日
    浏览(34)
  • 《Spring Boot源码解读与原理分析》书籍推荐

    Spring Boot 1.0.0 早在2014年就已经发布,只不过到了提倡“降本增效”的今天,Spring Boot才引起了越来越多企业的关注。Spring Boot是目前Java EE开发中颇受欢迎的框架之一。依托于底层Spring Framework的基础支撑,以及完善强大的特性设计,Spring Boot已成为业界流行的应用和微服务开发

    2024年02月14日
    浏览(25)
  • 【Spring Boot系列】- Spring Boot事务应用详解

    事务(Transaction)是数据库操作最基本单元,逻辑上一组操作,要么都成功。如果有一个操作失败。则事务操作都失败(回滚(Rollback))。 事务的四个特性(ACID): 1. 原子性(Atomicity) 一个事务(Transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间

    2024年02月08日
    浏览(37)
  • Spring Boot 事务和事务传播机制

    事务定义 将一组操作封装成一个执行单元 (封装到一起),这一组的执行具备原子性, 那么就要么全部成功,要么全部失败. 为什么要用事务? 比如转账分为两个操作: 第一步操作:A 账户-100 元。 第二步操作:B账户 +100 元。 如果没有事务,第一步执行成功了,第二步执行失败了,

    2024年02月11日
    浏览(28)
  • 在 Spring Boot 中使用事务

    当调用使用 @Transactional 注解的方法时,Spring Boot利用事务管理器来创建或加入事务。事务管理器监视事务的生命周期,根据操作结果进行提交或回滚。 Spring Boot支持各种事务隔离级别,包括READ_UNCOMMITTED(读取未提交的数据)、READ_COMMITTED(读取已提交的数据)、REPEATABLE_READ(

    2024年01月25日
    浏览(25)
  • Spring Boot 集成 API 文档 - Swagger、Knife4J、Smart-Doc

    Swagger 作为 API 设计和文档的强大工具,是一个由专门的工具集合支持的框架,它在整个 API 的生命周期中发挥作用,从设计和文档,到测试和部署。通过提供可视化界面,Swagger 让开发人员和最终用户都能清晰地理解和操作 API。 使用建议:笔者建议优先考虑 Knife4J,它已经能

    2024年01月22日
    浏览(48)
  • spring boot 整合jdbc和事务

    目录 1、j在pom文件中引入dbc驱动与mybatis  2、数据库连接池参数配置 3、mybatis配置 4、application配置 5、通用mapper配置 6、编写UserMapper 7、user表(需要自行去mysql创建数据库表新增用户数据,sql语句见下一步) 8、sql信息 9、UserService编写 10、测试结果 11、测试输出结果 访问效果

    2024年02月15日
    浏览(31)
  • Spring Boot 中的事务超时时间

    在 Spring Boot 中,事务管理是一个非常重要的话题。当我们在数据库中执行一些复杂的操作时,需要确保这些操作能够在一定的时间内完成,否则可能会导致数据一致性问题。为了解决这个问题,Spring Boot 提供了事务超时时间的设置。 事务超时时间是指一个事务在执行中最长

    2024年02月07日
    浏览(29)
  • Spring Boot 中的 Seata 分布式事务

    在分布式系统中,保证数据的一致性是一个非常重要的问题。传统的 ACID 事务模型虽然能够保证单个数据库的数据一致性,但是在分布式系统中却很难实现。因此,近年来出现了一些新的事务模型,其中 Seata 就是一种比较流行的模型。 在本文中,我们将介绍 Spring Boot 中的

    2024年02月09日
    浏览(26)
  • Java企业级信息系统开发学习笔记(4.2)Spring Boot项目单元测试、热部署与原理分析

    该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/pG623】 1. 添加测试依赖启动器和单元测试 修改pom.xml文件,添加依赖 刷新项目依赖 2. 创建测试类与测试方法 在 src/test/java 里创建 cn.kox.boot 包,创建测试类 TestHelloWorld01 给测试类添加测试启动器注解与Spring

    2024年02月10日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包