高级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的事务管理通过提供声明式和编程式两种事务管理方式,以及丰富的事务属性和灵活的传播行为,为开发者提供了一种强大而灵活的事务管理机制。

相关推荐
bug菌¹1 分钟前
滚雪球学SpringCloud[2.1]:服务注册中心Eureka
spring·spring cloud·eureka
一只邪恶大泡5 分钟前
为什么HTTPS会引入SSL/TLS协议
开发语言·数据结构·数据库·sql·mysql
Ting-yu6 分钟前
零基础学习Redis(10) -- zset类型命令使用
数据库·redis·学习
pokemon..7 分钟前
Redis 配置
数据库·redis·缓存
问道飞鱼12 分钟前
嵌入式数据库sqlite和rocksdb的介绍以及对比
数据库·sqlite·rocksdb
q5673152318 分钟前
Django 文件上传时出现 500 错误
开发语言·数据库·后端·python·django·sqlite
086小包字23 分钟前
Day51 | 117. 软件构建(拓扑排序)47. 参加科学大会 dijkstra(朴素版)
java·数据结构·算法·图论·拓扑排序
容若只如初见25 分钟前
项目实战应用Redis分布式锁
数据库·redis·分布式
xujinwei_gingko26 分钟前
Mybatis批量操作
java·mybatis
PinkHub35 分钟前
Java后端编程语言进阶篇
java·菜鸟新手