大厂面试官问我:MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?【后端八股文九:Mysql事务八股文合集】

news2024/11/18 2:27:33

本文为【Mysql事务八股文合集】初版,后续还会进行优化更新,欢迎大家关注交流~

大家第一眼看到这个标题,不知道心中是否有答案了?在面试当中,面试官经常对项目亮点进行深挖,来考察你对这个项目亮点的理解以及思考!这个时候,你如果可以回答出面试官的问题,甚至是主动说出自己的思考,那在面试中是大大加分的~

 

什么是事务?

事务是逻辑的一组操作,要么都执行,要么都不执行

# 开启一个事务
START TRANSACTION;
# 多条 SQL 语句
SQL1,SQL2...
## 提交事务
COMMIT;

请你描述下事务的特性?

(ACID)
(一原吃哥)
原子性A   最小的执行单位,不允许分割      要么全部完成,要么完全不起作用
一致性C 前后,数据库从一个一致性状态转换到另一个一致性
隔离性I   并发    不被其他事务所干扰   事务独立
持久性D  提交后   改变是持久

怎么实现

原子性(redo 和 undo 日志)
在执行事务期间,将修改的数据写入 redo 日志,并在事务提交前将其持久化到磁盘,确保事务的持久性。如果事务发生故障或回滚操作,可以使用 undo 日志来撤销事务的修改,使数据回滚到事务开始之前的状态。
隔离性(锁机制和多版本并发控制)
持久性(redo 日志)

innodb的默认隔离级别以及使用的技术

默认隔离级别是可重复读RR,但是用到了MVCC的快照读当前读技术以及next-key锁,所以可以解决幻读问题。对标SQL标准的可串行化。

对事务隔离级别的理解

(未提交读,提交读,可重复读,串行化)
READ_UNCOMMITTED(未提交读)
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可以重复读

解决了更新丢失,但还是可能会出现脏读

READ_COMMITTED(提交读)
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
(Oracle的隔离级别)
解决了更新丢失和脏读问题

REPEATABLE_READ(可重复读)
在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的
通常针对数据更新(UPDATE)操作。
解决了更新丢失、脏读、不可重复读、但是还会出现幻读

SERIALIZABLE(串行化):
最高的隔离级别,完全服从 ACID 的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读
但是这将严重影响程序的性能。通常情况下也不会用到该级别。
解决了更新丢失、脏读、不可重复读、幻读(虚读)

只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。

【扩展:脏读、幻读或不可重复读】
【扩展:每种隔离级别分别解决了什么问题】
【扩展:实现原理】

实现原理

读未提交,采取的是"不加锁读"原理。

  • 事务读不加锁,不阻塞其他事务的读和写
  • 事务写阻塞其他事务写,但不阻塞其他事务读;

读已提交
锁定读
事务在读取数据时会对数据进行短暂的排他锁定,确保其他事务不能修改数据。

实现可重复读,MySQL 采用了 MVVC (多版本并发控制) 的方式。
每个事务在读取数据时会创建一个数据快照,并使用保存的快照来获取一致的结果。

串行化

  • 所有SELECT语句会隐式转化为SELECT … FOR SHARE,即加共享锁
  • 读加共享锁,写加排他锁,读写互斥。如果有未提交的事务正在修改某些行,所有select这些行的语句都会阻塞。

可重复读怎么实现的

MVCC(多版本并发控制): MySQL使用MVCC来实现可重复读。在MVCC中,每行数据都会有一个创建版本号(也称为事务ID或时间戳)和一个过期版本号。当一个事务开始时,它会获得一个唯一的事务ID。在事务执行期间,它只能看到创建版本号小于或等于自己事务ID的数据。这确保了事务只会读取到它开始之前已经提交的数据,而不会读取到正在进行中的其他事务的数据。

读已提交和可重复读中 readView 有什么区别

在读已提交中,每个查询都会创建一个新的readView,读取最新的已提交事务的数据。在可重复读中,一个事务的整个生命周期内只创建一个readView,始终读取相同的版本,以确保事务的一致性视图。

如何解决脏读

通过排他锁和共享锁完成。事务A加排他锁进行修改,事务结束前不会释放锁。事务B想要读取,要共享锁,但是由于有了排他锁,因此共享锁阻塞。等事务A结束,才能读取得到。

既然innodb的可重复读已经解决了幻读问题,那么和串行化的实现区别是什么

可重复读通过next-key锁解决了当前读下的幻读问题。而串行化是通过加表锁来解决的。

解释下什么叫脏读、不可重复读和幻读?

(并发事务带来的)
脏读
(读取未提交数据)
(一个事务正在访问数据并进行了修改,而这种修改还未提交,另外一个事务也访问到了这个数据,使用了这个还未修改的数据)
(读未提交的数据)

不可重复读
(前后多次读取,数据内容不一致)
在一个事务内,多次读同一数据,另一个事务访问修改,导致数据读取结果不一样
(多次结果不同,查询期间另一个事务修改数据)

幻读
(前后多次读取,数据总量不一致)
(类似不可重复读,在发生一个事务1读取几行数据,接着另一个事务插入了一些数据,导致第一个事务1多一些原本不存在的,像是幻觉,所以叫幻读)

丢失修改
一个事务读取数据,另一个事务也访问,都修改了数据,但丢失了事务1修改的数据
(两个同时修改)

不可重复读和脏读的区别
脏读是读取另一个事务未提交的脏数据
不可重复读是读取了前一事务提交的数据

可重复读(RR)怎么解决幻读

在可重复读的情况下,MySQL引入MVCC,但MVCC并没有真正解决了幻读
可重复读开启了间隙锁,而间隙锁解决了幻读。

所以在可重复读下用间隙锁或next key锁才可以防止幻读。不使用间隙锁是无法解决幻读的。其实在读提交下检测唯一索引的唯一性也会开启间隙锁。

next-key locks由record locks(索引加锁) 和 gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)

解决方案

不可重复读是读取了其他事务更改的数据,针对update操作
解决:
使用行级锁,锁定该行

幻读是读取了其他事务新增的数据,针对insert和delete操作
解决:
(1)使用表级锁,锁定整张表
(2)间隙锁是innodb中行锁的一种, 但是这种锁锁住的却不止一行数据,他锁住的是多行,是一个数据范围。间隙锁的主要作用是为了防止出现幻读,但是它会把锁定范围扩大,

(3)MVCC也可以

Mysql默认的隔离级别

MySQL默认采用的 REPEATABLE_READ隔离级别。(可重复读)

Oracle 默认采用的 READ_COMMITTED 隔离级别。(提交读)

谈谈对MVCC的了解

(相当于给我们的MySQL数据库拍个“快照”)
(版本号,读只读事务前的快照,并发读写性能高,解决脏读、幻读、不可重复读,但不能解决更新丢失问题)
用于实现读已提交和可重复读取隔离级别。

在数据库中维护多个版本的数据来支持并发事务的同时读取和写入操作

MVCC的核心思想是每个事务在读取数据时看到的是一致性的快照,而不会受到其他并发事务的修改的影响。它基于以下两个基本概念:

  1. 版本号:每个数据项都有一个与之关联的版本号,用于标识数据的版本。版本号可以是递增的序列号、时间戳或其他唯一标识。
  2. 快照读取:事务在读取数据时,会根据自身的事务时间戳(或其他标识)选择合适的版本进行读取。只有那些在事务开始之前创建的、版本号小于等于事务时间戳的数据才能被读取,而在事务期间创建或修改的数据对该事务不可见。

多版本并发控制(MVCC)
一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,

读操作只读该事务开始前的数据库的快照

解决以下问题:

  1. 在并发读写数据库时,可以做到在读操作时不用阻塞写操作写操作也不用阻塞读操作提高了数据库并发读写的性能
  2. 同时还可以解决脏读,幻读,不可重复读等事务隔离问题,但不能解决更新丢失问题

MVCC的优势在于读操作不会阻塞写操作,也不会读取到脏数据。每个事务读取的是一致性的数据快照,因此可以实现高并发性和较好的隔离性。

实现

版本号

它的实现原理主要是依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的

当前读和快照读

select 快照读
快照读是读取事务开始前的数据样子,不受其他事务修改的影响,但可能遇到幻读问题。
(像不加锁的select操作就是快照读,即不加锁的非阻塞读)

会对数据修改的操作(update,insert,delete)都是采用当前读的模式
当前读是读取最新的数据,会反映其他事务的修改,确保数据一致性,但可能会导致锁竞争和性能开销。
(select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读)

说白了MVCC就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是悲观锁的实现

RR和RC下MVCC有什么区别

"RR" 代表 "Repeatable Read"(可重复读)
"RC" 代表 "Read Committed"(已提交读)

  • 在RR中,只要事务开始之后读了一次数据,那么就会生产快照,只会读都会直接读这个快照,因此不论别的事务怎么改动,都是可重复读的。
  • 而RC中,每次读都会生成一次快照,所以不可重复读

什么情况下mysql事务会失效?

  • DDL语句(CREATE TABLE, ALTER TABLE等)会隐式提交事务
  • LOCK TABLE语句会隐式提交事务
  • 用户执行COMMIT或ROLLBACK时
  • 发生致命错误(如服务器崩溃)时
  • 超时(事务执行时间太长)时

能否用mysql实现分布式锁

可以。MySQL提供了基于表的分布式锁实现方式,即使用一个专门的表来实现分布式锁。具体做法是:

  • 创建一个专门的表用于锁定
  • 事务开始时尝试获取锁,获取成功则执行业务逻辑,最后释放锁
  • 获取锁失败则重试或放弃

查询语句会开启事务吗,update语句会吗,为什么

  • 查询语句(SELECT)一般不会开启事务,除非显式地开启事务
  • Update语句会隐式地开启事务,因为它会修改数据,需要遵循ACID原则
  • 事务的开启和提交/回滚与DML语句(INSERT/UPDATE/DELETE)有关,而非SELECT

mysql 数据库事务回滚如何实现?

MySQL使用UNDO日志来实现事务回滚。UNDO日志记录了事务执行过程中的所有修改操作,当需要回滚时,MySQL会按照UNDO日志的反向操作来撤销之前的修改。

MySQL宕机重启了,怎么知道哪些事务是需要回滚的哪些是需要提交的?

MySQL宕机重启后如何知道哪些事务需要回滚:
MySQL会依赖于REDO日志和undo日志来进行恢复。

    • REDO日志记录了已提交事务的修改,用于恢复已提交的数据
    • UNDO日志记录了未提交事务的修改,用于回滚未提交的事务
      MySQL在重启时会扫描这两个日志,根据日志内容来判断哪些事务需要提交哪些需要回滚。

mysql事务实现的原理

(从redo log、bin log来思考)

  • REDO log用于记录数据页的修改,确保数据库在crash后可以恢复到最后一次提交的状态
  • BIN log用于记录所有数据库的变更操作,用于主从复制和备份恢复

mysql事务的死锁

当两个或多个事务在同时访问相同的数据资源且互相等待对方释放资源时,就会产生死锁。MySQL会检测到死锁的发生,并选择牺牲其中一个事务,让其他事务可以顺利完成。被牺牲的事务会收到"Deadlock found when trying to get lock; try restarting transaction"的错误。

  后期新的八股文合集文章会继续分享,感兴趣的小伙伴可以点个关注~

 更多精彩内容以及免费资料请关注公众号:绝命Coding

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

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

相关文章

AIGC | 为机器学习工作站安装NVIDIA 4070 Ti Super显卡驱动

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 话接上篇《AIGC | Ubuntu24.04桌面版安装后必要配置》文章,作为作者进行机器学习的基础篇(筑基期),后续将主要介绍机器学习环境之如何…

32位Arm嵌入式开发Ubuntu环境设置

32位Arm嵌入式开发Ubuntu环境设置 今天在调试一块32位ARM A7开发板时老是不成功,我装的是Ubuntu22.04版,在终端下运行工具链里的gdb程序居然报了一大堆错误,缺这个缺那个,按照提示装了一遍,再运行发现需要Python2.7环境…

NSK发布新版在线计算工具

July 01, 2024 NSK Ltd. Corporate Communications Department NSK Ltd. announced today that it has improved the engineering tools available on its website. The new engineering tools — NSK Online Catalog, Technical Calculations, and 2D/3D CAD Data — which …

STM32第十五课:LCD屏幕及应用

文章目录 需求一、LCD显示屏二、全屏图片三、数据显示1.显示欢迎词2.显示温湿度3.显示当前时间 四、需求实现代码 需求 1.在LCD屏上显示一张全屏图片。 2.在LCD屏上显示当前时间,温度,湿度。 一、LCD显示屏 液晶显示器,简称 LCD(Liquid Cry…

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列

分析Profiler Timeline中的算子序列,通过寻找频繁项集的办法,得到TOPK可融合的算子序列 1.相关链接2.代码【仅分析带通信算子的Pattern】3.在实际工程中发现 [all_gather, matrix_mm_out]频率最高4.[Ascend MC2](https://gitee.com/ascend/MindSpeed/blob/master/docs/features…

路径规划之基于二次规划的路径平滑Matlab代码

参考: 自动驾驶决策规划算法第二章第二节(上) 参考线模块_哔哩哔哩_bilibili 自动驾驶决策规划算法第二章第二节(下) 参考线代码实践_哔哩哔哩_bilibili QP函数,二次规划的逻辑 function [smooth_path_x,smooth_path_y] QP(path_x, path_y, w_cost_s…

docker也能提权??内网学习第6天 rsync未授权访问覆盖 sudo(cve-2021-3156)漏洞提权 polkit漏洞利用

现在我们来说说liunx提权的操作:前面我们说了环境变量,定时任务来进行提权的操作 rsync未授权访问覆盖 我们先来说说什么是rsync rsync是数据备份工具,默认是开启的873端口 我们在进行远程连接的时候,如果它没有让我们输入账号…

从海上长城到数字防线:视频技术在海域边防现代化中的创新应用

随着全球化和科技发展的加速,海域安全问题日益凸显其重要性。海域边防作为国家安全的第一道防线,其监控和管理面临着诸多挑战。近年来,视频技术的快速发展为海域边防场景提供了新的解决方案,其高效、实时、远程的监控特点极大地提…

【优化论】基本概念与细节

优化论(Optimization Theory)是数学和计算机科学中一个重要的分支,旨在寻找给定问题的最优解。这个领域的应用非常广泛,从经济学、工程学到机器学习、金融等各个领域都有其踪迹。我们可以通过一系列直观的比喻来理解优化论的基本概…

数据库之SQL(二)

目录 一、简述SQL中如何将“行”转换为“列” 二、简述SQL注入 三、如何将一张表的部分数据更新到另一张表 四、WHERE和HAVING的区别 一、简述SQL中如何将“行”转换为“列” 我们以MySQL数据库为例,来说明行转列的实现方式。 首先,假设我们有一张分…

2024亚太杯中文赛数学建模B题完整论文讲解(含每一问python代码+结果+可视化图)

大家好呀,从发布赛题一直到现在,总算完成了2024 年第十四届 APMCM 亚太地区大学生数学建模竞赛B题洪水灾害的数据分析与预测完整的成品论文。 本论文可以保证原创,保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人…

【JavaWeb程序设计】JSP编程II

目录 一、输入并运行下面的import_test.jsp页面 1.1 代码运行结果 1.2 修改编码之后的运行结果 二、errorPage属性和isErrorPage属性的使用 2.1 下面的hello.jsp页面执行时将抛出一个异常,它指定了错误处理页面为errorHandler.jsp。 2.1.2 运行截图 2.2 下面…

罗剑锋的C++实战笔记学习(一):const、智能指针、lambda表达式

1、const 1)、常量 const一般的用法就是修饰变量、引用、指针,修饰之后它们就变成了常量,需要注意的是const并未区分出编译期常量和运行期常量,并且const只保证了运行时不直接被修改 一般的情况,const放在左边&…

政安晨【零基础玩转各类开源AI项目】基于Ubuntu系统部署ComfyUI:功能最强大、模块化程度最高的Stable Diffusion图形用户界面和后台

目录 ComfyUI的特性介绍 开始安装 做点准备工作 在Conda虚拟环境中进行 依赖项的安装 运行 政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 收录专栏: 零基础玩转各类开源AI项目 希望政安晨的博客能够对您有所裨益,如有不足之处&…

2024年江苏省研究生数学建模竞赛B题人造革性能优化设计研究论文和代码

经过不懈的努力, 2024年江苏省研究生数学建模竞赛B题人造革性能优化设计研究论文和代码已完成,代码为C题全部问题的代码,论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解(问题1模型的建立和求解、问题2模…

适用于 Windows的 5 个最佳 PDF 转 Word 转换器

PDF 文件是共享文档的首选格式,但是,此类文件存在限制,使其难以修改或编辑。因此,您可能会发现自己正在寻找一种将 PDF 文件转换为 Word 或其他可编辑格式的方法。 有许多不同的 PDF 转换器,每个转换器的功能略有不同…

KDTree 简单原理与实现

介绍 K-D树是一种二叉树的数据结构,其中每个节点代表一个k维点,可用于组织K维空间中的点,其中K通常是一个非常大的数字。二叉树结构允许对多维空间中的点进行非常有效的搜索,包括最近邻搜索和范围搜索,树中的每个非叶…

嵌入式系统中状态机实现详解

嵌入式开发中系统经常处于某种状态,如何处理呢?接下来分析一下,状态机的实现无非就是 3 个要素:状态、事件、响应。转换成具体的行为就 3 句话。 发生了什么事? 现在系统处在什么状态? 在这样的状态下发生了这样的事,系统要干什么? 用 C 语言实现状态机主要有 3 种方法…

机器学习——岭回归

1、岭回归与线性回归的区别 岭回归(Ridge Regression)和线性回归(Linear Regression)都是用于回归分析的统计方法,但它们在处理方式和应用场景上有一些关键的区别: a)基本概念 线性回归:目标是…

帕金森病患者在选择运动疗法时应该注意哪些事项?

帕金森病患者在选择运动疗法时,应该遵循以下几点注意事项: 个性化运动处方:根据患者的病情、年龄、健康状况、以往运动能力等因素,制定个体化的运动处方。 避免运动负荷过大:运动时间不宜过长,注意控制心率…