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

java面试题-Spring事务以及@Transactional注解详解

远离八股文,面试大白话,通俗且易懂

看完后试着用自己的话复述出来。有问题请指出,有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来,大家一起解决。

java面试题汇总-目录-持续更新中

 对于这个面试中高频问到的问题,不知道大家有多少了解。

以前经常会被问道:对于事务你有什么了解?具体怎么实现?

我的回答就很简单:在需要实现事务的方法上加上@Transactional注解。

显然,这只是最基本的实现,并没有过了解。所以这篇文章就详细的了解下Spring的事务以及@Transactional到底怎么正确使用。


还是从实际面试过程中回答吧,不要看着字数多,花五分钟(相信我~~~),每个都是递进的关系,读一下很好理解。也不要觉得是不是太大白话了,有时候遇到面试官执意探讨的时候,就是这个模式......:

如果问道这些问题,你也能按照下面的方式举例说出来,甚至举别的例子,就说明基本理解了。

面试官:你对spring的事务有多少了解?

回答:

        事务主要是针对一组数据库的操作,在这个操作过程中,可能涉及到多个业务逻辑或者多张表的修改业务,事务管理器会保存每一步的操作,最终一起提交(commit)。要么全部执行成功,要么全部执行失败并且回滚到事务最开始的状态。

        事务主要包含四个特性:原子性、一致性、隔离性、持久性

        原子性:要求事务过程中的所有操作是一个整体,要么全部成功,要么全部失败回滚。

        一致性:是指事务执行前后数据一致。举例来讲A给B转账,A和B的总额在数据执行前后应该保持一致(A有100,B有100,事务前总额200,A给B转50,事务结束后AB总额200)

        隔离性:即在并发的情况下,一个事务的执行不应该对其他事务产生影响,这个需要通过隔离级别来实现。

        持久性:即事务一旦提交成功,即使数据库或者系统发生故障,也应该正常保存在数据库中。


面试官:事务的隔离级别有哪些呢?

回答:

        隔离级别通常是用来应对并发操作的,就是多个线程同时对一条数据进行读写(可以理解为多个用户同时操作同一条数据)常见的隔离级别主要有-读未提交、读已提交、可重复读、串行化。这几个级别对数据的安全性越来越高,但是效率会越来越低。

        --

        读未提交:这是最低级别的隔离。意思就是A事务现在正在修改id=1的数据,但是因为还有其他业务没有执行完所以还没有commit。此时B事务开启后要获取id=1的这条数据,而获取的结果就是A事务已经修改后的结果。此时看上去没有问题,但是如果A事务在执行后面的逻辑的时候发生了异常,那么A事务对于id=1这条数据的修改就会被回滚。最终导致B事务获取到的结果就不准确了。这个现象叫做“脏读”

        --

        读已提交:为了解决“脏读”问题,特意引入,同时也是数据库事务的默认状态。根据名字也能明白就是事务只能读取到其他已经提交了的数据。比如id=1的这条数据金额是10,此时A事务开始执行,并且对id=1的数据进行修改成了12,因还有其他业务此时还没有提交。这时候B事务开启并且读取id=1的这条数据,他此时读取到的结果仍然是10。

        这样就解决了“脏读”的问题,但是并不完美,此时又出现了另外一个问题就是“不可重复读”。基于上面的逻辑,不可重复读的意思就是B事务开启的时候读取了id=1的这条数据结果是10,此时是因为A事务还没有提交。但是B事务可能也有很多逻辑要处理,在B事务第一次读取id=1这条数据结束后A事务提交了,这时候id=1的数据结果就是12。由于B事务还在处理其他业务,正巧需要再次获取id=1的这条数据,这时候因为隔离级别是读已提交并且A已经提交。所以得到的结果就是12。最终的现象就是B事务在同一个方法中先后两次获取id=1的数据,得到的结果一次是10 一次是12。这个现象就叫做“不可重复读”。

        --

        可重复读:为了解决“不可重复读”的问题,特意引入。还是原来的场景id=1的结果是10,A开启事务修改结果为12,还没提交。B开启事务第一次查询为10,此时A提交事务,B再次查询结果还是10。也就是B事务开启的时候,id=1的这条数据的结果是多少,直到B事务结束之前他的结果就还是多少。不会因为其他事务对这条数据修改了,就改变查询结果。

        但是此时还存在一个比较大的问题就是"幻读"。什么是幻读呢,这个理解起来可能看着和不可重复读差不多,但是还是有区别。幻读的意思就是A事务和B事务同时开启了,此时B事务查询user表中的数据是10条,这时候A事务给user表中添加了一条数据并提交。此时B事务又一次查询user表中的数据得到的结果是11条。两次结果不一致这个就叫做幻读。有人会问,我既然已经设置隔离级别是可重复读了,为什么还会出现不一致的情况?因为隔离级别针对的是单行数据的某个字段是否变化,但是对于表的一些聚合统计不受影响,比如count()、sum()、max()等等。很气人吧~~~~

        --

        串行化:这个...这个...就是最高级别的隔离了。串行的意思就是一个事务执行完成后,才能开始另外一个事务,这样前面几个级别出现的问题就全都解决了。但是执行效率也相对的慢了下来...所以需要根据系统做相映的取舍。

需要注意的是:脏读、不可重复读、幻读这几个不是说一个一个出现的,比如隔离级别是“读未提交”的时候,这三个问题是都存在的,只不过针对于它,最大的问题就是脏读。同理看下表

二、事务的实现(Transactional)

那么此时回到标题另一个问题@Transactional注解就很好理解了。

基于上面的这么多情况,就说明肯定不是直接在方法上加上@Transactional就能解决的。

spring事务的实现有编程式事务管理、声明式事务(注解式)

其中编程式事务管理和声明式了解下即可。先说主角@Transactional注解

@Transactional

这个注解是有很多参数可以配置的,具体看下方。用的比较多的就是..好吧,除了传播行为和readOnly我个人平时用的比较少,其他都有过配置。隔离级别其实也很少改变,看具体的业务场景吧。

传播行为:定义事务的传播行为,即当一个事务方法被另一个事务方法调用时,应该如何处理事务

1、@Transactional(propagation = Propagation.REQUIRED)-默认

如果当前没有事务,就新建一个事务;如果已经存在一个事务中,加入这个事务。如果加入,那么不管两个事务逻辑哪个出错,全都回滚

2、@Transactional(propagation = Propagation.REQUIRES_NEW)

每次都新建一个事务,挂起当前事务。也就是对当前事务不受影响。新事务失败当前事务不回滚

隔离级别:定义事务的隔离级别,即多个事务并发执行时,事务之间的隔离程度

@Transactional(isolation = Isolation.READ_COMMITTED)

timeout(超时时间):定义事务的超时时间,即事务在多长时间内必须完成。超过指定时间,事务将被回滚。单位是秒

@Transactional(timeout = 60)

readOnly: 指定事务是否为只读。如果设置为 true,表示事务只读取数据但不修改数据,这可以优化事务性能

@Transactional(readOnly = true)

rollbackFornoRollbackFor:定义在哪些异常情况下回滚事务,或者在哪些异常情况下不回滚事务。

@Transactional(rollbackFor = {SQLException.class, CustomException.class})

编程式事务管理

 了解就好,很少使用。

public class MyTransactionService {private TransactionTemplate transactionTemplate;public void setTransactionTemplate(TransactionTemplate transactionTemplate) {this.transactionTemplate = transactionTemplate;}public void performTransaction() {transactionTemplate.execute(new TransactionCallbackWithoutResult() {@Overrideprotected void doInTransactionWithoutResult(TransactionStatus status) {try {// 事务内的业务逻辑// 模拟某种条件,判断是否需要回滚if (someCondition) {// 如果满足条件,标记事务为回滚状态status.setRollbackOnly();return;}// 继续事务内的其他业务逻辑} catch (Exception e) {// 发生异常,标记事务为回滚状态status.setRollbackOnly();throw e;  // 抛出异常,触发回滚}}});}
}
 声明式事务管理

一般就是在xml文件中或者注解中@Transactional其实也属于声明式,只不过一般都称为注解式

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/>
</bean><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" propagation="REQUIRED"/></tx:attributes>
</tx:advice><aop:config><aop:pointcut id="serviceMethods" expression="execution(* com.example.service.*.*(..))"/><aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethods"/>
</aop:config>

相关文章:

java面试题-Spring事务以及@Transactional注解详解

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 对于这个面试中高频问到…...

ARM流水灯

.text .global _start _start: LED1 1.RCC时钟使能GPIOE RCC_MP_AHB4ENSETR[4]->1 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x1<<4) STR R1,[R0] 2.设置PE10为输出模式 GPIOE_MODER[21:20]->01 先清0 LDR R0,0x50006000 LDR R1,[R0] BIC R1,R1,#(0x3<&…...

docker-compose单机容器编排

Dockerfile:先配置好文件&#xff0c;然后build&#xff0c;镜像-------->容器。 docker-conpose 既可以基于dockerfile,也可以基于镜像&#xff0c;一键式拉起镜像和容器。 docker-compose核心就是yml文件&#xff0c;可以定义容器的一切。通过yml配置&#xff0c;直接运行…...

matlab信号分选系统算法-完整算法结构

matlab信号分选系统算法 针对得到的脉冲流PDW进行信号分选&#xff0c;包括重频恒定、重频抖动、重频参差和重频滑变四种脉间调制类型。   这里我们先进行数据的仿真&#xff0c;后续边仿真边分享思路&#xff1a;首先根据信号类型&#xff0c;分别产生重频恒定、重频抖动、重…...

十八)Stable Diffusion使用教程:艺术二维码案例

今天说说怎么样使用SD生成艺术二维码。 我们直接上图。 方式有三种,分别如下: 1)方式一:直接 contronet 的tile模型进行控制 使用QRBTF Classic生成你的二维码。 首先输入网址,选择喜欢的二维码样式(推荐第一种就行): 然后选择相应参数,这里推荐最大的容错率,定…...

【LeetCode每日一题】53. 最大子数组和

https://leetcode.cn/problems/maximum-subarray/description/ 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 方式一&#xff1a;暴力…...

机器学习笔记 什么是协方差矩阵?

一、协方差矩阵 协方差矩阵是一种矩阵,用于表示随机向量中给定的元素对之间的协方差值。协方差矩阵也可以称为色散矩阵或方差-协方差矩阵。这是因为每个元素的方差是沿着矩阵的主对角线表示的。 协方差矩阵始终是方阵。此外,它是半正定且对称的。该矩阵在随机建模和主成分分析…...

使用Python监控服务器在线状态

前言 在公司内网有一台服务器&#xff0c;有动态的公网IP&#xff0c;使用DDNS对外提供服务&#xff0c;但是会因为停电、服务器卡死等原因导致服务器离线。服务器离线后无法及时获知&#xff0c;因此需要实现在服务器离线的时候能够发送消息到手机上。 思路梳理 公司办理的…...

【JAVA】黑马MybatisPlus 学习笔记【二】【核心功能】

2.核心功能 刚才的案例中都是以id为条件的简单CRUD&#xff0c;一些复杂条件的SQL语句就要用到一些更高级的功能了。 2.1.条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外&…...

区块链实验室(30) - 区块链期刊:Distributed Ledger Technologies: Research and Practice

区块链涉及多学科及技术&#xff0c;众多期刊接收区块链文章。Distributed Ledger Technologies: Research and Practice是ACM出版集团的一本期刊。 Distributed Ledger Technologies: Research and Practice创刊历史很短&#xff0c;始于2022年&#xff0c;出版期数也不多。 载…...

Nginx【通俗易懂】《中篇》

目录 1.Url重写rewrite 2.防盗链 3.静态资源压缩 4.跨域问题 1.Url重写rewrite &#x1f929;&#x1f929;&#x1f929; 1.1.rewrite书写格式 rewrite是实现URL重写的关键指令&#xff0c;根据regex&#xff08;正则表达式&#xff09;部分内容&#xff0c;重定向到rep…...

组件的二次封装

在React中&#xff0c;使用扩展运算符&#xff08;...&#xff09;来传递props的作用是将一个对象的所有可枚举属性&#xff08;包括自身的和继承的&#xff09;复制到新创建的对象中。当我们在二次封装组件时使用它&#xff0c;可以方便地将所有传递给我们的props传递给基础组…...

curl+postman 在java开发中的使用(提高效率)

概念 curl 是一个常用的命令行工具&#xff0c;用于发送各种类型的 HTTP 请求&#xff0c;包括 GET、POST、PUT、DELETE 等。它也可以用来下载文件、上传文件、设置 cookie、发送 multipart/form-data 等等。 使用 调用post接口 实际中的接口&#xff1a; curl --location…...

【电子取证:FTK IMAGER 篇】DD、E01系统镜像动态仿真

​ 文章目录 【电子取证&#xff1a;FTK Imager 篇】DD、E01系统镜像动态仿真一、DD、E01系统镜像动态仿真 &#xff08;一&#xff09;使用到的软件 1、FTK Imager (v4.5.0.3)2、VMware Workstation 15 Pro (v15.5.2)&#xff08;二&#xff09;FTK Imager 挂载镜像 1、选择 …...

netcat瑞士军刀

netcat瑞士军刀 1、nc简介3、从示例中学习2、命令格式及常用参数 1、nc简介 nc&#xff08;netcat&#xff09;是一个短小精悍、功能实用、简单可靠的网络工具&#xff0c;主要有如下作用&#xff1a; &#xff08;1&#xff09;端口侦听&#xff0c;nc 可以作为 server 以 TC…...

【征稿倒计时十天】第三届高性能计算与通信工程国际学术会议(HPCCE 2023)

【有ISSN、ISBN号&#xff01;&#xff01;往届均已完成EI检索】 第三届高性能计算与通信工程国际学术会议(HPCCE 2023) 2023 3rd International Conference on High Performance Computing and Communication Engineering (HPCCE 2023) 2023年12月22-24日 | 中国哈尔滨 第三…...

编程应用实际场景:台球厅怎么样用电脑给客人计时,台球计时收费系统操作教程

一、前言 准确控制顾客在店内游玩的时间&#xff0c;从而控制店内的各项成本&#xff0c;并提升店内的客流量。在顾客享受计时项目的时候&#xff0c;可以同时添加其他食物消费&#xff0c;并将单据合并统一结账。软件中的会员功能可以为客户办理会员可以使用灯控器控灯&#…...

云计算大屏,可视化云计算分析平台(云实时数据大屏PSD源文件)

大屏组件可以让UI设计师的工作更加便捷&#xff0c;使其更高效快速的完成设计任务。现分享可视化云分析系统、可视化云计算分析平台、云实时数据大屏的大屏Photoshop源文件&#xff0c;开箱即用&#xff01; 若需 更多行业 相关的大屏&#xff0c;请移步小7的另一篇文章&#…...

高频js-----js执行机制 Event Loop

修改代码,让代码每隔1秒输出1-5 for (var i 0; i < 5;i) {setTimeout(() > {console.log(i)}, 1000)} 首先我们需要了解js的执行机制 (Event Loop) js是单线层,如果现在执行上面代码的话 会输出 5个5 这里不明白的同学可以去看一下我以前发布的关于EventLoop的文章 …...

恢复出厂设置后在 Android 上恢复照片的 6 种常用方法

恢复出厂设置可帮助您删除电子设备的所有信息并将其恢复到原始系统状态。但是&#xff0c;如果您不小心按下了恢复出厂设置按钮并从 Android 设备中删除了所有难忘的照片&#xff0c;该怎么办&#xff1f;好吧&#xff0c;您无需担心&#xff0c;因为可以通过以下一些方法来恢复…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...