Spring的两种事务管理机制,面试这样答当场入职!

news2025/2/2 23:47:06

前言:
博主在最近的几次面试中,大中小厂都问到了Spring的事务相关问题,这块知识确实是面试中的重点内容,因此结合所看的书籍,在这篇文章中总结下。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读,感谢大佬的关注。

如果文章有什么需要改进的地方欢迎大佬提出,对大佬有帮助希望可以支持下哦~

小威在此先感谢各位小伙伴儿了😁

在这里插入图片描述

以下正文开始

在这里插入图片描述

文章目录

  • 声明式事务管理
  • 注解式管理事务
  • 事务传播行为
  • 事务隔离级别
  • 学生管理系统demo
  • 使用声明式事务管理demo
  • 使用注解的事务管理demo
  • 面试这样答

Spring事务包括声明式事务管理和注解式事务管理,我们通过概念和小demo的形式一步一步地来一起学习这个知识点!

声明式事务管理

首先简单介绍下Spring的声明式事务管理:

声明式事务管理是指通过配置来实现事务管理,我们只需定义事务边界和事务属性,不需要显式编写事务管理的代码。

那么我们如何实现呢?

首先配置事务管理器和数据源:通过配置 <bean> 元素,使用 TransactionManager 类型的 Bean 来提供事务管理器的实例,并使用 DataSource 类型的 Bean 来提供数据源。

接着定义事务边界:使用 <tx:advice> 元素来定义事务边界和事务属性,指定哪些方法需要进行事务管理。

还需要配置事务通知:使用 <aop:config> 元素来启用事务管理功能并将事务通知应用到指定的切入点上。

理论知识先讲到这里,储备这些知识可以和面试官进行交流~

在这里插入图片描述

注解式管理事务

除了上面提到的声明式管理之外,Spring提供了一种更加简单且强大的方式来管理事务,通过使用注解式事务,可以在方法级别上进行声明和配置事务的行为。这块面试官问的更多,我们来详细介绍下:

@Transactional注解(核心注解): @Transactional是Spring中最常用的注解之一,用于标识需要进行事务管理的方法或类。它可以应用在方法上或类上,而且还可以配置这些属性:

  1. value:指定事务管理器的名称(如果有多个事务管理器)。
  2. propagation:指定事务传播行为,默认值为REQUIRED。
  3. isolation:指定事务隔离级别,默认值为DEFAULT
  4. readOnly:指定事务是否为只读事务,默认值为false。
  5. timeout:指定事务超时时间,默认值为-1,表示不设置超时。

在这里插入图片描述

事务传播行为

上面介绍了Spring实现事务的两种方式,接下来介绍下另一个重量级的知识点–》事务传播行为。

事务传播行为定义了当一个事务方法调用另一个事务方法时,如何处理事务的范围。Spring提供了多种传播行为选项,包括:

  1. REQUIRED:如果当前没有事务,则创建一个新的事务;如果已存在事务,则加入到当前事务中。
  2. REQUIRES_NEW:每次都会创建一个新的事务,如果已存在事务则将其挂起。
  3. SUPPORTS:如果当前存在事务,则加入到当前事务中;如果没有事务,则以非事务方式执行。
  4. NOT_SUPPORTED:以非事务方式执行方法,如果当前存在事务则将其挂起。
  5. NEVER:以非事务方式执行方法,如果当前存在事务则抛出异常。
  6. MANDATORY:如果当前存在事务,则加入到当前事务中;如果没有事务,则抛出异常。
  7. NESTED:如果当前存在事务,则将该事务嵌套到当前事务中作为一个保存点,可以回滚到该保存点。

在这里插入图片描述

事务隔离级别

接下来介绍下 spring的事务隔离级别,这一块也是面试官经常问到的一点。它与数据库的事务隔离级别有着异曲同工之妙。

事务隔离级别定义了多个事务同时运行时彼此之间的可见性和影响范围。Spring支持以下事务隔离级别:

  • DEFAULT:使用数据库默认的事务隔离级别。
  • READ_UNCOMMITTED:最低级别的隔离级别,允许读取未提交的数据。
  • READ_COMMITTED:允许读取已提交的数据。
  • REPEATABLE_READ:对同一数据的多次读取结果保持一致,避免脏读和不可重复读。
  • SERIALIZABLE:最高级别的隔离级别,确保事务串行执行,避免任何并发问题。
  • 只读事务(readOnly): 如果一个事务中的方法仅执行读操作而不进行写操作时,可以将事务标记为只读事务。这样做可以提高性能,因为只读事务不需要对数据进行锁定。

在这里插入图片描述

学生管理系统demo

如果上面的概念看着有点懵,那么接下来让我们通过一个学生管理系统的demo来详细介绍 Spring 的声明式事务和基于注解的事务管理。

我从项目中扒出来部分伪代码,现在我们有一个简单的学生管理系统,其中包含两个服务方法:addStudent()updateStudent()。addStudent() 方法用于添加学生信息,updateStudent() 方法用于更新学生信息。

使用声明式事务管理demo

前面概念部分提到过,在声明式事务管理中,我们可以使用 XML 配置来定义事务边界和事务特性。

首先,我们需要配置事务管理器和数据源。在 Spring 配置文件中,我们可以使用 TransactionManager 元素和 DataSource 元素来配置相应的 Bean。

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- 数据源配置 -->
</bean>

接下来,定义事务边界,我们可以在服务类中使用 :


<bean id="studentService" class="com.test.StudentService">
    <!-- 依赖注入 -->
</bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="add*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
    </tx:attributes>
</tx:advice>

<aop:config>
    <aop:pointcut id="studentServicePointcut" expression="execution(* com.example.StudentService.*(..))" />
    <aop:advisor advice-ref="txAdvice" pointcut-ref="studentServicePointcut" />
</aop:config>

在上面的代码中,我们使用了 <tx:advice> 元素来配置事务边界。通过 <tx:method> 元素,我们可以指定需要进行事务管理的方法并定义事务传播行为。

最后,在 Spring 配置文件中,我们需要启用事务管理功能并配置事务通知。

<tx:annotation-driven transaction-manager="transactionManager" />

我们配置了以上代码,因此Spring 会自动扫描带有 @Transactional 注解的方法,并生成事务通知。

使用注解的事务管理demo

首先第一步也是配置事务管理器和数据源,这一步与声明式事务管理相同,因此不在赘述。

接着定义事务边界,这点与声明式事务管理相比,基于注解的事务管理不再需要在 Spring 配置文件中进行额外的配置。我们只需在服务类中使用 @Transactional 注解即可。

@Service
public class StudentService {
    // ...

    @Transactional
    public void addStudent(Student student) {
        // 添加学生信息,管理系统伪代码省略
    }

    @Transactional
    public void updateStudent(Student student) {
        // 更新学生信息,管理系统伪代码省略
    }

    // ...
}

通过添加 @Transactional 注解到服务类中的方法上,我们直接就实现了对 addStudent() 和 updateStudent() 方法的事务管理。

同时,我们也可以将 @Transactional 注解应用到接口定义或抽象类的方法上,以便在子类中继承和覆盖时继续享受事务管理功能。

面试这样答

声明式事务管理和基于注解的事务管理是 Spring 提供的两种常用事务管理方式。它们都能够简化事务管理的配置和编写,并提供了灵活的事务特性。

在声明式事务管理中,我们使用 XML 配置或注解来定义事务边界和事务通知。通过使用 <tx:advice> 元素和 <tx:method> 元素,我们可以指定需要进行事务管理的方法并定义事务传播行为。

而基于注解的事务管理更加简洁,只需在服务类的方法上添加 @Transactional 注解即可实现事务管理。

无论是哪种方式,Spring 的事务管理机制都使得我们能够轻松实现数据的一致性和完整性。通过合理配置事务特性,我们可以满足不同业务场景下的事务需求。

文章到这里就先结束了,感兴趣的可以订阅专栏哈,后续会继续分享相关的知识点。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

刻录到光盘功能看不见怎么办

刻录到光盘功能看不见怎么办 1、 打开组策略 同时按键WINR&#xff0c;打开运行对话框&#xff0c;输入gpedit.msc&#xff0c;打开组策略&#xff08;如果发现输入gpedit.msc后无法打开组策略&#xff0c;请参照文件后面的方法进行操作&#xff09; 2 、查找“删除CD刻录…

Java开发基础系列(五):对象方法参数

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(五)&#xff1a;对象方法参数 ⏱️ 创作时间&#x…

Pycharm 搭建 Django 项目,看完这一篇就够了

1. 安装需求 在使用 python 框架 Django 需要注意下面事项 Pycharm 版本是专业版而不是社区版本Pycharm 配置好了 python 解释器 &#xff08;一般我们现在用的都是python3&#xff09;我自己使用的是 Pycharm 版本是2020.1.2 2. 准备工作 2.1 新建项目 首先我们打开 Pycharm …

opencv -10 基础运算之 图像加权和(图像融合图像修复视频合成)

什么是图像加权和&#xff1f; 所谓图像加权和&#xff0c;就是在计算两幅图像的像素值之和时&#xff0c;将每幅图像的权重考虑进来&#xff0c;可以用公式表示为&#xff1a; dst saturate(src1 &#x1d6fc; src2 &#x1d6fd; &#x1d6fe;)式中&#xff0c;satu…

无缝集成:基于FastAPI实现AI模型服务与nacos的完美融合

1 场景介绍 当我们使用python构建AI模型算法的过程中&#xff0c;经常会遇到如下的问题&#xff1a; 这个模型如何提供给其他微服务调用&#xff08;比如JAVA构建的微服务&#xff09;&#xff1f;这个模型如何做到多个服务节点的负载均衡&#xff1f;这个模型如何做到服务的…

Python高光谱遥感数据处理与高光谱遥感机器学习方法深度应用

提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇&#xff0c;用通俗易懂的语言解释高光谱的基本概念和理论&#xff0c;深入理解科学原理。方法篇结合Python编程工具&#xff0c;专注于解决高频技术难题&#xff0c…

工欲善其事,必先利其器之—react-native-debugger调试react native应用

调试react应用通常利用chrome的inspector的功能和两个最常用的扩展 1、React Developer Tools &#xff08;主要用于debug组件结构) 2、Redux DevTools &#xff08;主要用于debug redux store的数据&#xff09; 对于react native应用&#xff0c;我们一般就使用react-nativ…

C++无锁编程——无锁队列

C无锁编程——无锁队列 贺志国 2023.7.11 上一篇博客给出了最简单的C数据结构——堆栈的几种无锁实现方法。队列的挑战与栈的有些不同&#xff0c;因为Push()和Pop()函数在队列中操作的不是同一个地方。因此同步的需求就不一样。需要保证对一端的修改是正确的&#xff0c;且对…

TCP/IP网络编程 第十二章:I/O复用

基于I/O复用的服务器端 多进程服务器端的缺点和解决方法 为了构建并发服务器&#xff0c;只要有客户端连接请求就会创建新进程。这的确是实际操作中采用的种方案&#xff0c;但并非十全十美&#xff0c;因为创建进程时需要付出极大代价。这需要大量的运算和内存空间&#xff…

Vue列表排序

开始前先回顾一下sort排序用法&#xff1a; 定义一串数组arr&#xff0c;使用sort排序&#xff0c;会收到前后两个数据项设置两个参数a&#xff0c;b。 注意&#xff1a;a-b 是升序 b-a 是降序 a-b升序&#xff1a; <script>let arr [12,11,2,5,76,33]arr.sort((a,b…

家居商城小程序:打造舒适家居生活的优选平台

随着人们对家居生活品质的追求&#xff0c;家居商城小程序成为提供便捷购物和个性化服务的不可或缺的工具。通过家居商城小程序&#xff0c;用户可以浏览并购买各类家居商品&#xff0c;如家具、装饰品、家纺等。同时&#xff0c;家居商城小程序能提供热销商品推荐、客户评价和…

浅析高校用电问题及智慧电力监管平台的构建 安科瑞 许敏

摘 要&#xff1a;介绍了当前高校用电存在的问题&#xff0c;进行了原因分析&#xff0c;由此提出建立高校用电智慧监管平台。对高校用电智慧监管平台的构架进行设计&#xff0c;运用物联网技术&#xff0c;实现各回路实时自主控制&#xff0c;并细化管理权限&#xff0c;实现…

Swift 周报 第三十三期

文章目录 前言新闻和社区App 内购买项目和订阅即将实行价格与税率调整为家庭提供安全的 App 体验 提案正在审查的提案 Swift论坛推荐博文话题讨论关于我们 前言 本期是 Swift 编辑组自主整理周报的第二十四期&#xff0c;每个模块已初步成型。各位读者如果有好的提议&#xff…

公网访问的Linux CentOS本地Web站点搭建指南

文章目录 前言1. 本地搭建web站点2. 测试局域网访问3. 公开本地web网站3.1 安装cpolar内网穿透3.2 创建http隧道&#xff0c;指向本地80端口3.3 配置后台服务 4. 配置固定二级子域名5. 测试使用固定二级子域名访问本地web站点 前言 在web项目中,部署的web站点需要被外部访问,则…

常规函数和箭头函数之间的主要区别

常规函数和箭头函数之间的主要区别 在 JavaScript 中&#xff0c;函数是设计用于执行特定任务的代码块。函数允许使用函数将大型程序分解为多个更小、更易于管理的组件。因此&#xff0c;我们就不再需要重复编写相同的代码。 JavaScript中有两种类型的函数 常规函数箭头函数…

jmeter如何进行web脚本录制

目录 录制web脚本 &#xff08;1&#xff09;jmeter中设置HTTP代理 &#xff08;2&#xff09;浏览器中设置代理 &#xff08;3&#xff09;页面操作 &#xff08;4&#xff09;查看录制的web脚本 &#xff08;5&#xff09;脚本内容过滤 &#xff08;6&#xff09;脚本优化…

练习 数列前n项和(递归函数)

C++自学精简教程 目录(必读) 数列的前n项和 S = 1 + 2 + 3 + ...... + n 之前我们用for循环求解数列前n项和,本文用递归函数求解。 代码如下 #include <iostream> using namespace std;int f(int a) {if (a == 1){return 1;}else{return a + f(a - 1);} }int main(…

APP外包开发中的H5框架

在开发APP的技术中&#xff0c;除了原生开发外也可以使用H5框架来开发。原生开发的特点是质量高&#xff0c;用户体验更好&#xff0c;但成本高&#xff0c;适用于对质量要求高的APP项目。H5框架的特点是通用性较强&#xff0c;对开发人员的要求相对较低&#xff0c;成本也低&a…

从小众到大热:海外网红营销的成功之道

在当今数字时代&#xff0c;社交媒体已经成为人们获取信息、沟通交流的主要渠道之一。而在这个社交媒体的浪潮中&#xff0c;海外网红营销逐渐从小众走向大热。它以其独特的营销模式和广泛的受众群体&#xff0c;成为许多品牌和企业的首选营销方式。本文Nox聚星将详细介绍海外网…

高等学校节能监控平台的具体应用 安科瑞 许敏

摘要&#xff1a;高校节能监控平台&#xff0c;主要是通过物联网技术实现对水、电、气等高耗能设备进行计量和控制&#xff0c;为高校能耗的分析&#xff0c;能源流向&#xff0c;节能目标提供有力的数据支撑。高效节能监控平台主要包括能耗监测系统、照明节能控制系统、空调节…