关于事务的最常见的十道面试题

news2024/9/27 5:55:04

面试题一:什么是事务?为什么需要事务?

事务(Transaction)是保证数据库可靠性和稳定性的一种机制,单个逻辑工作单元执行的一系列操作,这些操作要么全部完成,要么全部不完成,是数据库环境中的最小工作单元。事务具有四个特征,也被称为(ACID):

  • 原子性:事务中包含的所有操作要么完成,要么不完成。假设你要从你的储蓄账户向你的支票账户转账100元。这个操作实际上包含两个步骤:从储蓄账户扣除100元,然后在支票账户中增加100元。这两个步骤必须都完成,或者都不完成。如果在转账过程中发生错误(例如,扣款成功但是存款失败),那么整个事务应该被回滚,就好像从未发生过一样
  • 一致性:事务执行的结果必须是数据库从一个一致性状态到另一个一致性状态。在转账事务开始和结束时,你的总资产(储蓄账户和支票账户的总和)应该保持不变。如果你开始时有1000元,那么无论转账多少次,你结束时总资产(储蓄账户和支票账户的总和)应该有1000元。
  • 隔离性:一个事务的执行不能被其他事务所干扰。指的是正在执行的转账业务没有提交之前,其他事务能不能看到转账的详情,不同的隔离级别看到的数据是不一样的,例如最低的隔离级别读未提交,它是能读取转账执行一半未提交的数据的(但这个数据位脏数据,可能提交也可能回滚)
  • 持久性:一旦事务提交,它对数据库中的改变是永久性的。即使在事务完成后立即发生系统故障,你的支票账户中也应该有那100元

为什么要使用事务?

事务提供了一种逻辑上的一致性和数据完整性的机制,以确保对数据库的更改是可靠性和可恢复性。例如,在银行转账的场景中,如果在转账过程中的任何一步出现问题,如网络异常或服务器宕机等,没有事务的情况下,我们需要自己处理各种异常情况以保证双方账户金额的准确性,这会使编程的复杂性急剧上升。而有了数据库层面的事务保证,能够降低我们的开发难度,许多问题可以交给事务去处理。因此,事务的存在可以简化编程模型,使得在访问和更新数据库时更加安全和可靠

面试题二:事务有哪些特性?举例说明一下

事务具有四个特征,也被称为(ACID):

  • 原子性:事务中包含的所有操作要么完成,要么不完成。假设你要从你的储蓄账户向你的支票账户转账100元。这个操作实际上包含两个步骤:从储蓄账户扣除100元,然后在支票账户中增加100元。这两个步骤必须都完成,或者都不完成。如果在转账过程中发生错误(例如,扣款成功但是存款失败),那么整个事务应该被回滚,就好像从未发生过一样
  • 一致性:事务执行的结果必须是数据库从一个一致性状态到另一个一致性状态。在转账事务开始和结束时,你的总资产(储蓄账户和支票账户的总和)应该保持不变。如果你开始时有1000元,那么无论转账多少次,你结束时总资产(储蓄账户和支票账户的总和)应该有1000元。
  • 隔离性:一个事务的执行不能被其他事务所干扰。假设你正在从储蓄账户向支票账户转账,同时你的朋友也正在查看你的总资产。在转账事务完成之前,你的朋友不应该看到任何中间状态
  • 持久性:一旦事务提交,它对数据库中的改变是永久性的。即使在事务完成后立即发生系统故障,你的支票账户中也应该有那100元

面试题三:MySQL如何保证事务四大特性?

MySQL通过以下几种方式保证事物的四大特性:

  1.  原子性是通过Undo Log(回滚日志)来保证的。InnoDB使用日志(Undo Log)来记录事务的操作,包括事务开始、修改数据和事务提交等。如果十五执行失败或者回滚,InnoDB可以使用日志来撤销已经执行的操作,确保 事物的原子性
  2. 持久性是通过Redo Log(重做日志)来保证的。在事务提交之前,InnoDB会将事物的修改操作先写入事务日志(Redo Log),然后再将数据写入磁盘。即使在系统崩溃或者断电的情况下,InnoDBb还是可以通过重放事务日志来恢复数据,确保事务的持久性
  3. 隔离性是通过MVCC(多版本并发控制)和锁机制来保证的
  4. 一致性是通过各种约束,如主键、外键、唯一约束等,加上事务的持久性、原子性和隔离性来保证的

 面试题四:在日常开发中哪些功能会使用到事务?举例说明一下

在日常开发中只要舍恩基达奥多张表要一起执行的场景,要么一起成功,要么一起失败,都会使用到事务。例如以下场景:

  • 银行转账业务:需要给一账户增加钱,一个账号减少钱
  • 电商下单业务:在电商系统中的下单业务也需要事务,需要将账户余额扣减、库存扣减、添加订单等操作,这些都需要放到一个事务里
  • 用户中心完善资料业务:当涉及一个系统中有用户完善资料的场景中通常也需要使用事务,因为这个操作通常至少要修改两个表,一个是修改用户主表信息,然后再给用户积分表添加完善资料的积分操作,所以这种场景需要使用到事务

面试题五:在开发中怎样使用事务的?

在开发中使用事务主要涉及以下几个方面:

  • 事务的基础知识:事务的四大特性是原子性、一致性、隔离性和持久性。事务的隔离级别包括读未提交、读已提交、可重复读和串行化。
  • 事务的传播行为:事务传播行为指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。例如,如果方法A(事务方法)调用了方法B(事务方法),那么方法B是继续在调用者方法A的事务中运行,还是为自己开启一个新的事务运行,这就是由方法B的事务传播行为决定的。
  • 使用@Transactional注解:在方法上加入@Transactional注解后,这个方法就成为了事务方法。如果方法中出现了RuntimeException(运行时异常),事务会进行回滚,如果出现了checkedException (编译时异常),则不会回滚。我们可以在@Transactional注解中进行手动配置,以实现方法抛出具体异常进行回滚的逻辑。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void createUser(User user) {
        try {
            userRepository.save(user);
        } catch (Exception e) {
            // 如果在保存用户时出现异常,事务将回滚
            throw new RuntimeException("Unable to save user", e);
        }
    }
}
  • 异常处理:如果我们在事务方法中,手动捕获了异常,并没有让事务抛出去,也没有手动指定需要回滚,那么事务方法即使出现异常,也会提交事务。
  • 事务方法调用事务方法:如果事务方法A调用了事务方法B,并且我们想让B出现异常后,A捕获异常不影响主流程,我们可以把B方法的传播机制设置为REQUIRED_NEW,这样A、B方法就是两个不同的事务,互不影响。
     

面试题六:MySQL中有哪些事务隔离级别?

MySQL中事务隔离级别主要是分为以下四种:

读未提交(Read Uncommitted):最低的隔离级别,事务中未提交的修改数据,可以被其他事务读取到

        优点:并发性能最好,读到的数据最新

        缺点:存在脏读(Dirty Read)问题,即读取到未提交的数据,可能导致数据不一致

读已提交(Read Commited):事务中未提交的修改数据,不会被其他事务读取到,此隔离级别看到的数据,都是其他事务已经提交的数据

        优点:避免脏读问题

        缺点:存在不可重复读(Non-Repeatable Read)问题,即同一个事务中,不同时间读取的数据可能不同

可重复读(Repeatable Read):是指在一个事务中,多次执行相同的查询语句可能会得到不同的结果,因为其他并发事务在该事务正在进行时修改了数据

        优点:解决了不可重复读问题

        缺点:存在幻读(Phanton Read)问题,即在一个事务中,两次查询同一范围的记录,但第二次查询却发现了新的纪录

串行化(Serializable):最高的隔离级别,将所有的事务串行化执行(一个执行完成,执行下一个),保证了数据的完全隔离

        优点:避免了幻读问题

        缺点:并发性能最差,可能导致大量锁等待和死锁

MySQL中事务隔离级别就是为了解决咋能都、不可重复读和幻读问题等,这四种隔离级别与三个问题之间的关系如下:

面试题七:不可重复读和幻读有什么区别?

不可重复读:是指在同一事务中,不同时间读取的数据可能不一样。因为其他并发事务在该事务正在进行时修改了数据

幻读:是指在一个事务中,多次执行相同的查询语句可能会返回不同的结果集,因为其他并发事务在该事务正在进行时插入了新的数据行。

不可重复读和幻读都是并发事务引起的读一致性问题,但是两者关注的侧重点和解决方案不同:

侧重点不同:

        不可重复读关注的是一行数据的变化,它是指在同一事务中,多次读取同一行数据的结果不一样。这是由于其他并发事务对同一行数据进行了修改(例如更新操作),导致两次读取之间数据发生变化

        幻读关注的是范围数据的变化,它指的是在同一事务中,多次查询同一个范围的数据时,结果集的行数发生变化。这是由于其他并发事务在查询范围内插入了新的数据或者从中删除了数据,导致两次查询之间结果集中的行数发生变化

解决方法不同:

        不可重复读通常是使用行锁来解决,因为他关注的是一行数据

        幻读通常使用间隙锁来解决,因为他关注的是范围数据

面试题八:如何解决不可重复读和幻读的问题?

不可重复读和幻读都可以通过设置事务的隔离级别来解决,将事务隔离级别设置成串行化,那么不可重复读和幻读就可以解决了。但是串行化的执行效率太低了,所以日常工作中我们使用以下几种方式解决:

  • 解决不可重复读问题:将数据库的隔离级别设置为可重复读(RR)级别(它是MySQL默认事务隔离级别)
  • 解决幻读问题:通过MVCC+MySQL中的锁机制来解决

面试题九:什么是MVCC机制?它能解决幻读问题吗?为什么?

MVCC是多版本并发控制。它是一种并发控制方法,一般在数据库管理系统中,实现对数据库的并发访问。MVCC的作用其实就是避免同一个数据在不同事务之间竞争,提高系统的并发性能。它的特点如下:

  • 允许多版本同时存在,并发执行
  • 不依赖锁机制,性能高
  • 只在读已提交和可重复读的事务隔离级别下工作

使用MVCC机制解决了RR隔离级别中,部分幻读问题,但是有完全把全部幻读问题都解决:

  • MVCC解决了RR隔离级别中,快照读的幻读问题。多次查询快照读的时候,因为RR级别是复用Read View(读视图),所以没有幻读问题
  • MVCC解决不了RR隔离级别中,如果遇见快照读和当前读(读取当前最新数据)中间发生了添加操作,那么么Read View不能复用,就会出现幻读问题

快照读: 是指在一个事务中,读取的数据版本是在事务开始时已经存在的数据版本,而不是最新的数据版本。这种读取方式提供了事务在执行期间看到的数据视图的一致性,select 查询就是快照读

当前读: 是指在事务中读取最新的数据版本,以下几种操作都是当前读

  1. select ... for update;
  2. select ... lock in share mode;
  3. insert ...
  4. update ...
  5. delete ...

所以说 MVCC 可以解决 RR 级别中快照读的幻读问题,但解决不了 RR 级别中的当前读的幻读问题,因为当前读是读取最新数据,此时 MVCC 机制也解决不了幻读问题了,但可以使用锁 (Next-Lock) 配合 MVCC 底解决幻读问题

面试题十:MySQL 有哪些重要的日志?

MySQL中重要的日志有以下几种:

  1. 慢查询日志(Slow Query Log): 记录执行时间超过指定值的查询语句。慢查询日志可以帮助识别性能较差的查询语句,以便进行优化。此日志默认关闭,需要手动开启
  2. 二进制日志(Binary Log): 记录对数据库进行更改的所有操作,包括INSERT、UPDATE、DELETE 等。二进制日志可以用于数据恢复、主从复制和数据同步等场景。
  3. 回滚日志(Undo Log): InnoDB 引擎中的日志,主要用于事务回滚和 MVCC 机制。重做日志(Redo Log): InnoDB 引擎中的日志,主要用于掉电或其他故障恢复的持久化日志
  4. 重做日志(RedoLog):InnoDB引擎中的日志,主要用于掉电或其他故障恢复的持久化日志

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

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

相关文章

Aria2 WebUI控制台 任意文件读取漏洞复现(CVE-2023-39141)

0x01 产品简介 Aria2 WebUI控制台是用于下载文件的实用程序。它支持 HTTP(S)/FTP/SFTP/BitTorrent 和 Metalink 协议。aria2可以从多个来源/协议下载文件,并尝试利用您的最大下载带宽。它支持同时从HTTP(S)/FTP/SFTP和BitTorrent下载文件,而从HTTP(S)/FTP/SFTP下载的数据上…

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…

深入了解WPF控件:常用属性与用法(六)

掌握WPF控件:熟练常用属性(六) ListView 用于展示数据项集合的列表控件。它提供了丰富的功能和灵活的定制性,可以轻松地展示和编辑大量的数据。 常用属性描述ItemsSource用于设置ListView的数据源。可以是一个集合、数组或列表…

架构师考试相关信息

文章目录 去年考试安排官网通知: 中国计算机技术职业资格网(今年的安排估计2月份放出,结果大约12月) 1.系统架构的考试要求: (1)掌握计算机硬软件与网络的基础知识; &…

模板方法模式介绍

目录 一、模板方法模式介绍 1.1 模板方法模式的定义 1.2 模板方法模式的原理 1.2.1 模板方法模式类图 1.2.2 类图角色说明 1.2.3 示例代码 二、模板方法模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 账户抽象类 2.2.2 借款一个月 2.2.3 借款7天 2.2.4 测试类 三、…

helm---自动化一键部署

什么是helm?? 在没有这个helm之前,deployment service ingress helm的作用就是通过打包的方式,把deployment service ingress 这些打包在一块,一键式部署服务,类似于yum 官方提供的一个类似于安装仓库的功能,可以实…

Unity学习之坦克游戏制作(1)开始场景的制作

文章目录 1. 实现效果2. 场景装饰2.1 创建场景2.2 拖入场景地板 3 开始界面3.1 导入UI3.2 创建面板基类3.2.1 开始按钮 4 设置界面5 音效数据逻辑5.1 音效数据可持久化5.2 声明音效管理的主要变量5.3 声明数据管理器5.4 在设置面板的数据初始化5.5 提供API给外部 6 排行榜界面6…

​WordPress顶部管理工具栏怎么添加一二级自定义菜单?

默认情况下,WordPress前端和后台页面顶部都有一个“管理工具栏”,左侧一般就是站点名称、评论、新建,右侧就是您好,用户名称和头像。那么我们是否可以在这个管理工具栏中添加一些一二级自定义菜单呢? 其实&#xff0c…

JavaScript库jquery的使用方法

"写更少,做更多"是jquery的设计理念,jquery是一个兼容多浏览器的JavaScript库,利用jquery的语法设计能使开发更便捷。 网页添加jquery的方法:1.从jquery.com下载库;2.从CDN中载入库(示例使用)&a…

线性代数:矩阵运算(加减、数乘、乘法、幂、除、转置)

目录 加减 数乘 矩阵与矩阵相乘 矩阵的幂 矩阵转置 方阵的行列式 方阵的行列式,证明:|AB| |A| |B| 加减 数乘 矩阵与矩阵相乘 矩阵的幂 矩阵转置 方阵的行列式 方阵的行列式,证明:|AB| |A| |B|

项目管理中如何有效沟通?项目管理有效沟通指南

无论是少数人的小型企业还是拥有数十名员工的大公司,有效的沟通对于确保每个人都参与并准备好在项目中实现相同的目标至关重要。 然而,由于沟通不畅,似乎在翻译中总是丢失一些东西。事实上,根据布兰迪斯大学的一项研究&#xff0c…

k8s集群加入一个master2--kubeadm方式

已经有一个集群: 192.168.206.138 master 192.168.206.136 k8s-node1 192.168.206.137 k8s-node2 kubectl get nodes -o wide 新加入一个master2节点 192.168.206.139 master2 一、初始化系统参数 139 master2 上 #在136、137、138上添加hosts“” echo "…

MSG3D

论文在stgcn与sta-lstm基础上做的。下面讲一下里面的方法: 1.准备工作 符号。这里是对符号进行解释。 一个人体骨骼图被记为G(v,E) 图卷积: 图卷积定义 考虑一种常用于处理图像的标准卷积神经网络 (CNN)。输入是像素网格。每个像素都有一个数据值向…

protobuf 之诡异的文件流与压缩

只接上干货,内容较干。文章大概需要花费5分钟简单了解下。 1、Gzip 直接看源码头文件如上图。压缩对象 GzipOutputStream ,通过函数操作可以看到整个文件流是比较完整并清晰。 因为它显示清晰包含了 从初始化 到 flush 到 close 的显示调用 2、Ostream…

同样是IT行业,测试和开发薪资真就差这么大吗?

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

ESP32-TCP服务端(Arduino)

将ESP32设置为TCP服务器 介绍 TCP(Transmission Control Protocol)传输控制协议,是一种面向连接的(一个客户端对应一个服务端)、可靠的传输层协议。在TCP的工作原理中,它会将消息或文件分解为更小的片段&a…

c++:string相关的oj题(把字符串转换成整数、344.反转字符串、387. 字符串中的第一个唯一字符、917. 仅仅反转字母)

文章目录 1.把字符串转换成整数题目详情代码思路 2. 344.反转字符串题目详情代码1思路1代码2思路 3. 387. 字符串中的第一个唯一字符题目详情代码思路 4. 917. 仅仅反转字母题目详情代码思路 1.把字符串转换成整数 传送门 题目详情 代码 class Solution { public:int StrToI…

DDOD(Disentangle Your Dense Object Detector)解析

paper:Disentangle Your Dense Object Detector official implementation:https://github.com/zehuichen123/DDOD third-party implementation:https://github.com/open-mmlab/mmdetection/tree/main/configs/ddod 存在的问题 现有的目标…

Docker命令---搜索镜像

介绍 使用docker命令搜索镜像。 命令 docker search 镜像命令:版本号示例 以搜索ElasticSearch镜像为例 docker search ElasticSearch

华而有实,维乐Prevail Glide带你领略风景线,成为风景线~

大家都知道呢!骑行,不仅是一种运动,更是一种生活态度。在骑行装备的世界里,一个好的坐垫对于骑行的舒适度和安全性至关重要。那今天,我要为大家推荐一款备受赞誉的坐垫——维乐坐垫美学系列-Prevail Glide。    为…