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

高级java每日一道面试题-2024年8月28日-框架篇[Spring篇]-你对Spring的事务管理了解多少?

如果有遗漏,评论区告诉我进行补充

面试官: 你对Spring的事务管理?

我回答:

在Java高级面试中,关于Spring的事务管理是一个常见且重要的话题。Spring框架通过其强大的事务抽象,为开发者提供了一种简便的方式来管理事务,无论是声明式事务还是编程式事务。下面我将详细解释Spring的事务管理。

事务的基本概念

在数据库管理系统中,事务(transaction)是一系列数据库操作的集合,这些操作被视为一个单独的工作单元。事务的四个特性(ACID)是:

  • 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败,不能部分成功。
  • 一致性(Consistency):事务完成后,数据库必须处于一致的状态。
  • 隔离性(Isolation):并发执行的事务不会相互影响,每一个事务都像在独立的环境中运行一样。
  • 持久性(Durability):一旦事务完成,其对数据库的更改就是永久性的,即使系统崩溃也不会丢失。

Spring 事务管理概述

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

  • 编程式事务管理:通过手动编码来控制事务的生命周期。
  • 声明式事务管理:通过注解或 XML 配置来定义事务边界。

Spring事务管理的核心概念

  • 事务管理器(TransactionManager):Spring提供了PlatformTransactionManager接口,它是所有事务管理器的抽象,具体实现如DataSourceTransactionManager(用于JDBC)、JpaTransactionManager(用于JPA)等。
  • 事务属性(Transaction Attributes):包括传播行为、隔离级别、超时时间、只读标志和回滚规则等,这些属性定义了事务的行为。

声明式事务管理

声明式事务管理是Spring推荐的方式,它通过AOP(面向切面编程)技术将事务管理逻辑与业务逻辑分离,使得开发者只需关注业务逻辑的实现,而无需编写具体的事务管理代码。

  • @Transactional注解:这是声明式事务管理的核心。开发者可以将@Transactional注解应用于类或方法上,以声明事务的边界和属性。
    • 类级别:当@Transactional注解应用于类级别时,该类的所有公共方法都将被事务管理。
    • 方法级别:当@Transactional注解应用于方法级别时,只有该方法会被事务管理。
  • 事务属性@Transactional注解提供了多个属性来定义事务的行为,如propagation(传播行为)、isolation(隔离级别)、timeout(超时时间)、readOnly(只读标志)、rollbackFor(回滚规则)等。

编程式事务管理

虽然声明式事务管理是Spring推荐的方式,但在某些情况下,开发者可能需要更细粒度地控制事务,这时可以使用编程式事务管理。

  • TransactionTemplateTransactionTemplate是Spring提供的一个模板类,它简化了编程式事务管理的复杂性。开发者可以通过TransactionTemplateexecute方法来执行事务操作,execute方法接受一个回调接口TransactionCallback的实现,该接口定义了事务中的业务逻辑。
  • PlatformTransactionManager:开发者也可以直接通过PlatformTransactionManager接口来管理事务,这种方式提供了更高的灵活性,但相应地也增加了代码的复杂性。

事务的传播行为

事务的传播行为定义了事务方法被另一个事务方法调用时,事务应该如何进行。Spring定义了七种传播行为,如REQUIRED(如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务)、REQUIRES_NEW(创建一个新的事务,并暂停当前事务(如果存在))等。

事务传播行为

事务传播行为定义了事务方法在调用其他事务方法时的行为。Spring 支持七种传播行为:

  • PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。
  • PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  • PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。
  • PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,并挂起当前事务(如果存在)。
  • PROPAGATION_NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。
  • PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则表现得像 PROPAGATION_REQUIRED

事务隔离级别

事务隔离级别定义了事务之间的交互方式。Spring 支持五种隔离级别:

  • ISOLATION_DEFAULT:使用底层数据库的默认隔离级别。
  • ISOLATION_READ_UNCOMMITTED:最低的隔离级别,允许读取未提交的数据。
  • ISOLATION_READ_COMMITTED:允许读取其他事务已经提交的数据。
  • ISOLATION_REPEATABLE_READ:事务多次读取同一数据应返回相同的结果。
  • ISOLATION_SERIALIZABLE:最高的隔离级别,完全隔离事务,保证数据一致性。

异常处理

在 Spring 事务管理中,异常处理非常重要,因为它是决定事务是否回滚的关键因素之一。Spring 区分了两类异常:

  • 受检异常(checked exception):这些异常需要被捕获和处理,通常是应用程序级别的错误。
  • 非受检异常(unchecked exception):如 RuntimeExceptionError,这些异常默认会导致事务回滚。

事务管理器

要启用 Spring 的事务管理,需要定义一个 PlatformTransactionManager 的 bean。常见的事务管理器有:

  • DataSourceTransactionManager:适用于普通的 JDBC 数据源。
  • JpaTransactionManager:适用于 JPA 环境。

总结

Spring的事务管理通过提供声明式和编程式两种事务管理方式,以及丰富的事务属性和灵活的传播行为,为开发者提供了一种强大而灵活的事务管理机制。


http://www.kler.cn/news/290450.html

相关文章:

  • Windows bat脚本学习七(从hex文件中获取bin大小)
  • centos 局域网 内部 时间同步 chrony
  • PHP7 的内核结构
  • 河南省第三届职业技能大赛 网站技术(世赛选拔)项目任务书
  • Go 项目中的 GOPROXY 设置
  • 三极管的检测方法与经验
  • Transiting from CUDA to HIP(三)
  • 刘润《关键跃升》读书笔记6
  • Linux基础指令(二)详解
  • 告别PDF格式困扰,2024年PDF转换器推荐
  • 「OC」iOS事件处理流程
  • Elasticsearch之储存原理和优化
  • 部分设计模式(java语言版本)
  • 常见排序方法详解(图示+方法)
  • VBA中类的解读及应用第十五讲:让文本框在激活时改变颜色(上)
  • HarmonyOS开发实战( Beta5版)多线程能力场景化示例最佳实践
  • 虚幻地形高度图生成及测试
  • 【论文分享】MyTEE: Own the Trusted Execution Environment on Embedded Devices 23‘NDSS
  • 使用FFmpeg的AVFilter转换YUV到RGB
  • 别天天看看直播了,你知道如何用jmeter对直播间做压测吗
  • LearnOpenGL学习笔记
  • MySQL复习4
  • 构建灵活的搜索系统:Go 语言实践
  • AI驱动测试管理工具会有哪些发展前景呢?
  • 关于多线程unique_lock和guard_lock
  • 冒泡排序及qsort函数
  • P1505 [国家集训队] 旅游
  • 【C++深入学习】日期类函数从无到有实现
  • day-49 使数组中所有元素相等的最小操作数
  • glsl着色器学习(三)