当前位置: 首页 > article >正文

Spring事务——针对实习面试

目录

  • Spring事务
    • 事务的基本概念
    • Spring管理事务的方式有几种?
    • Spring事务中有哪几种事务传播行为?
    • Spring事务中的隔离级别有哪几种?
    • Spring事务如何回滚的?
    • @Transactional注解有什么用?

Spring事务

在这里插入图片描述

事务的基本概念

在Spring框架中,事务的基本概念主要围绕以下几个核心概念:

  1. 事务(Transaction)

    • 事务是数据库操作的逻辑单位,它由一系列数据库操作组成,这些操作要么全部成功,要么全部失败。事务保证了数据的完整性和一致性。
  2. 事务属性(Transaction Attributes)

    • 事务属性定义了事务的隔离级别、传播行为、超时设置、只读标志和回滚规则等。这些属性决定了事务应该如何被管理。
  3. 事务管理器(Transaction Manager)

    • 事务管理器负责管理事务的整个生命周期,包括开启事务、提交事务和回滚事务。Spring提供了多种事务管理器的实现,如DataSourceTransactionManagerHibernateTransactionManager等。
  4. 事务隔离级别(Transaction Isolation Level)

    • 隔离级别定义了事务之间的隔离程度,防止事务操作的数据被其他事务干扰。常见的隔离级别包括:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。
  5. 事务传播行为(Transaction Propagation Behavior)

    • 传播行为定义了当现有事务存在时,新事务应该如何被处理。Spring定义了多种传播行为,如REQUIRED、SUPPORTS、MANDATORY、REQUIRES_NEW、NOT_SUPPORTED、NEVER和NESTED。
  6. 声明式事务管理(Declarative Transaction Management)

    • 声明式事务管理使用Spring的AOP功能,通过在方法上添加@Transactional注解来声明事务属性,这种方式使得事务管理更加声明化和简洁。
  7. 编程式事务管理(Programmatic Transaction Management)

    • 编程式事务管理通过编码的方式直接使用PlatformTransactionManager接口来控制事务。这种方式更加灵活,但代码侵入性较强。
  8. 回滚规则(Rollback Rules)

    • 回滚规则定义了哪些异常会导致事务回滚。Spring默认的规则是运行时异常(RuntimeException及其子类)和Error会导致事务回滚,而检查型异常(checked exceptions)默认不回滚。
  9. 事务超时(Transaction Timeout)

    • 事务超时定义了事务可以运行的最长时间。如果事务运行时间超过这个时间限制,数据库将自动回滚事务。
  10. 事务的ACID属性

    • 原子性(Atomicity):事务中的所有操作要么全部完成,要么全部不完成。
    • 一致性(Consistency):事务必须保证数据库从一个一致性状态转变到另一个一致性状态。
    • 隔离性(Isolation):事务之间的操作是相互隔离的,一个事务的操作不能被其他事务干扰。
    • 持久性(Durability):一旦事务提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

这些概念构成了Spring事务管理的基础,理解这些概念有助于更好地使用Spring框架进行事务管理。

Spring管理事务的方式有几种?

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

  1. 声明式事务管理(Declarative Transaction Management)

    • 这是Spring推荐的方式,通过在代码中添加注解或在配置文件中使用XML标签来声明事务的边界和属性。声明式事务管理又分为两种形式:
      • 基于注解的方式:在方法上使用@Transactional注解来声明事务。这种方式简单直观,是最常用的声明式事务管理方式。
      • 基于XML配置的方式:在Spring的配置文件中使用<tx:*>标签来定义事务属性和切面(AOP),从而管理事务。
  2. 编程式事务管理(Programmatic Transaction Management)

    • 这种方式通过编程的方式直接使用Spring的PlatformTransactionManager接口来管理事务。编程式事务管理提供了更高的灵活性,但代码侵入性较强,需要手动管理事务的开启、提交和回滚。
    • 编程式事务管理通常使用TransactionTemplate或直接通过PlatformTransactionManager来实现。

这两种方式各有优缺点,声明式事务管理因其简单和非侵入性而更受欢迎,而编程式事务管理则在需要更细粒度控制事务时更为适用。在实际开发中,可以根据具体需求和场景选择适合的事务管理方式。

Spring事务中有哪几种事务传播行为?

Spring事务管理中定义了七种事务传播行为,这些行为通过PropagationBehavior枚举在TransactionDefinition接口中定义。以下是每种事务传播行为的详细说明:

  1. PROPAGATION_REQUIRED

    • 如果当前存在事务,则加入该事务;如果当前没有事务,就新建一个事务。这是最常见的传播行为。
  2. PROPAGATION_SUPPORTS

    • 如果当前存在事务,就加入该事务;如果当前没有事务,就以非事务方式执行。
  3. PROPAGATION_MANDATORY

    • 如果当前存在事务,则加入该事务;如果当前没有事务,就抛出异常。
  4. PROPAGATION_REQUIRES_NEW

    • 总是新建事务,如果当前存在事务,就把当前事务挂起。
  5. PROPAGATION_NOT_SUPPORTED

    • 总是非事务地执行,如果当前存在事务,就把当前事务挂起。
  6. PROPAGATION_NEVER

    • 总是非事务地执行,如果当前存在事务,就抛出异常。
  7. PROPAGATION_NESTED

    • 如果当前存在事务,则在当前事务内新建一个事务(嵌套事务)。如果当前没有事务,就新建一个事务。嵌套事务需要事务管理器支持嵌套事务。

这些传播行为允许开发者根据不同的业务需求来控制事务的边界和行为,从而实现灵活的事务管理。

Spring事务中的隔离级别有哪几种?

Spring事务中的隔离级别对应于数据库事务的隔离级别,用于定义事务在并发环境下如何可见和交互。Spring支持以下五种隔离级别:

  1. ISOLATION_DEFAULT

    • 使用底层数据库的默认隔离级别,通常在大多数数据库中是READ_COMMITTED
  2. ISOLATION_READ_UNCOMMITTED

    • 最低的隔离级别,允许读取未提交的数据,可能会导致脏读、不可重复读和幻读。
  3. ISOLATION_READ_COMMITTED

    • 保证可以读取到其他事务提交的数据,可以避免脏读,但仍有可能出现不可重复读和幻读。
  4. ISOLATION_REPEATABLE_READ

    • 保证在一个事务中多次读取同样的记录结果是一致的,除非数据是被本事务自己修改的,可以避免脏读和不可重复读,但幻读仍有可能发生。
  5. ISOLATION_SERIALIZABLE

    • 最高的隔离级别,完全串行化的事务,可以避免脏读、不可重复读和幻读,但会牺牲系统的并发性能。

隔离级别的选择取决于具体的业务需求和性能考量。较高的隔离级别可以提供更好的数据一致性保证,但可能会降低系统的并发性能。在实际应用中,需要根据业务场景和性能测试结果来选择合适的隔离级别。

Spring事务如何回滚的?

Spring事务的回滚主要通过以下两种方式实现:

  1. 自动回滚

    • 在声明式事务管理中,Spring默认的策略是当事务中的方法抛出了运行时异常(RuntimeException及其子类)或者Error时,事务会自动回滚。对于检查型异常(checked exceptions),Spring默认不回滚事务,除非你在@Transactional注解中通过rollbackFor属性明确指定了哪些异常需要回滚。

    例如:

    @Transactional(rollbackFor = CustomException.class)
    public void someServiceMethod() {
        // ...
    }
    

    在这个例子中,如果someServiceMethod方法抛出了CustomException异常,Spring事务管理器会自动回滚事务。

  2. 手动回滚

    • 在编程式事务管理中,你可以使用TransactionStatus对象来手动控制事务的回滚。TransactionStatus对象可以通过TransactionTemplateexecute方法或者PlatformTransactionManagergetTransaction方法获得。

    例如,使用TransactionTemplate

    TransactionTemplate template = new TransactionTemplate(transactionManager);
    template.execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            // ...
            if (需要回滚) {
                status.setRollbackOnly();
            }
        }
    });
    

    在这个例子中,如果doInTransactionWithoutResult方法中的逻辑判断需要回滚事务,可以调用status.setRollbackOnly()方法来标记事务为回滚状态。

    或者,如果你直接使用PlatformTransactionManager

    public void someServiceMethod() {
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        // 设置事务属性
        TransactionStatus status = transactionManager.getTransaction(def);
        try {
            // ...
        } catch (Exception e) {
            transactionManager.rollback(status);
        } finally {
            if (需要回滚) {
                transactionManager.rollback(status);
            }
        }
    }
    

    在这个例子中,如果需要回滚事务,可以直接调用transactionManager.rollback(status)方法。

这两种方式提供了灵活的事务回滚控制,可以根据具体的业务逻辑和异常处理需求来决定是否回滚事务。

@Transactional注解有什么用?

@Transactional注解是Spring框架提供的一种声明式事务管理的方式,它用于方法上,以表明该方法应该在一个事务的上下文中执行。使用@Transactional注解可以简化事务管理的复杂性,使得业务代码更加简洁和清晰。以下是@Transactional注解的一些主要用途和特点:

  1. 声明事务边界

    • 通过在方法上添加@Transactional注解,可以指定哪些方法应该在事务的上下文中执行,从而定义了事务的开始和结束点。
  2. 自动管理事务

    • Spring会自动管理这些方法的事务,包括事务的开启、提交和回滚。这意味着开发者不需要手动编写代码来管理事务的这些细节。
  3. 配置事务属性

    • @Transactional注解允许你配置事务的各种属性,如隔离级别、传播行为、超时时间、只读标志和回滚规则等。
  4. 异常驱动的回滚

    • 默认情况下,如果方法执行过程中抛出了运行时异常(RuntimeException及其子类)或Error,事务将会自动回滚。你也可以通过rollbackFor属性指定其他需要回滚的异常类型。
  5. 非异常回滚

    • 可以通过noRollbackFor属性指定不会导致事务回滚的异常类型。
  6. 事务传播行为

    • 通过propagation属性,可以定义方法的事务传播行为,例如是否应该加入现有的事务或创建一个新的事务。
  7. 事务超时和只读

    • 可以通过timeout属性设置事务的超时时间,以及通过readOnly属性指定事务是否为只读事务。
  8. 简化代码

    • 使用@Transactional注解可以避免在业务逻辑代码中混入事务管理代码,使得代码更加专注于业务逻辑本身。
  9. AOP支持

    • @Transactional注解是基于Spring AOP实现的,这意味着它可以通过切面来增强方法的执行,而不需要修改方法的实现。
  10. 灵活性和可重用性

    • 由于@Transactional注解是声明在方法层面的,因此它非常灵活,可以应用于任意需要事务管理的方法上,并且可以轻松地在不同的类或方法之间重用。

总的来说,@Transactional注解提供了一种简单而强大的方式来管理事务,使得开发者可以更加专注于业务逻辑的实现,而不是事务的管理细节。


http://www.kler.cn/a/402739.html

相关文章:

  • 整车安全需求考量的多维度深度剖析
  • UI自动化测试中公认最佳的设计模式-POM
  • Python 版本的 2024详细代码
  • Odoo :免费且开源的农牧行业ERP管理系统
  • 从熟练Python到入门学习C++(record 6)
  • gocv调用opencv添加中文乱码的解决方案
  • 如何使用 PyTorch 实现图像分类数据集的加载和处理
  • ArkTS---空安全、模块、并发
  • 【C++】踏上C++学习之旅(九):深入“类和对象“世界,掌握编程的黄金法则(四)(包含四大默认成员函数的练习以及const对象)
  • React 中使用 Axios 进行 HTTP 请求
  • 国内docker pull拉取镜像的解决方法
  • SpringBoot+Vue 2 多方法实现(图片/视频/报表)文件上传下载,示例超详细 !
  • Vue 3 组件通信:深入理解 Props 和 Emits 的使用与最佳实践
  • 【Spring MVC】初步了解Spring MVC的基本概念与如何与浏览器建立连接
  • 库的操作(MySQL)
  • 【设计模式】【创建型模式(Creational Patterns)】之抽象工厂模式(Abstract Factory Pattern)
  • 探索C/C++的奥秘之list
  • 实验室资源调度系统:基于Spring Boot的创新
  • 技术总结(三十三)
  • Flink使用详解
  • 【5】GD32H7xx CAN发送及FIFO接收
  • React 远程仓库拉取项目部署,无法部署问题
  • 【VTK】MFC中使用VTK9.3
  • 1+X应急响应(网络)威胁情报分析:
  • 百度遭初创企业指控抄袭,维权还是碰瓷?
  • Github 2024-11-20C开源项目日报 Top9