MYSQL篇--事务机制高频面试题

事务

1 什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。事务是逻辑上的一组操作,要么都执行,要么都不执行。
事务最经典也经常被拿出来说例子就是转账了。
假如小明要给小红转账1000元,这个转账会涉及到两个关键操作就是:将小明
的余额减少1000元,将小红的余额增加1000元。万一在这两个操作之间突然出现错误比如银行系统崩溃,导致小明余额减少而小红的余额没有增加,这样就不对了。
所以事务就是保证这两个关键操作要么都成功,要么都要失败。

2 事物的四大特性(ACID)介绍一下? 以及对应的实现原理说下

四大特性也就是原子性,一致性,隔离性,持久性
首先我们看原子性说白了就是当前事务的操作要么同时成功,要么同时失败,而原子性其实是由undo log日志来保证的
(这里简单介绍下undo log,undo log他其实是一种用于撤销回退的日志,也就是说在事务没提交之前 mysql会先记录更新前的数据到undo log日志文件中,当事务回滚时,可以用undo log来进行数据回滚,其实说白了undolog就是用执行的反向sql语句来进行回滚)

接着看隔离性:隔离性其实就是事务在并发执行过程中,不能互相干扰,而隔离性其实是由mysql中的各种锁以及mvcc机制实现
(之后会具体介绍mvcc等机制)

再看持久性持久性简单的理解就是一旦你提交了事务,那么它对于数据库的改变就是持久的,而持久性其实是由redo log日志来保证的
(这里也简单的说下redo log日志,首先 我们要知道当我们修改某条记录的时候其实并不是立刻刷入到磁盘的,而是会写buffer pool并将buffer pool标记为脏页,与此同时将本次对页的修改以redo log的形式记录下来,而后续innodb会在合适的时候通过后台线程将缓存再buffer pool中的脏页刷入到磁盘,这其实就是WAL技术
说白了WAL 就是mysql的写操作并不是立刻写到磁盘,而是先写文件,然后再合适的时间在写磁盘,
而正是因为有redo log的存在,即便系统崩溃了,还没来得及持久化脏页数据,mysql在重启后,会根据redo log的内容,将所有数据恢复到最新的状态。)

一致性:使用事务的最终目的,而一致性其实是由原子性,隔离性,持久性,这三个特性,以及业务代码正确逻辑来保证的
为啥说要保证正确逻辑呢?举个例子 比如说现在你先下单,在扣减库存,你下单成功了,但是扣减库存报错了,而你在try中执行的业务逻辑,catch中捕获时只是输出了日志并没有抛出异常,这就是导致了问题,即下单成功了,但是扣减库存失败了,所以说还需要保证逻辑的正确性

3 什么是脏读?幻读?不可重复读?

脏读:就是一个事务读取到了另外一个未提交事务的修改过的数据,就意味着发生了脏读,
简单解释下 就是比如事务A更新了一份数据,但是没有提交,而与此同时事务B也来读取相同的数据,因为事务A没有提交所以他随时是可以回滚的,一旦事务A发生回滚,那么事务B所读取的数据就是过期数据,这种现象就是脏读;

不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了不可重复读现象
而发生不可重复读可能是因为两次查询过程中间插入了事务更新原有数据的操作;
比如说现在有两个事务A和B,事务A先读取数据,之后继续执行逻辑处理,而在这过程中事务B更新了这条数据并提交了事务,那么当事务A再次读取数据的时候,就会发现前后两次读取到的数据不一致性

幻读:在一个事务的两次查询中,数据的记录条数不一致,这就意味着幻读
简单说下 比如说现在有事务A和B,他们同时在处理,一开始事务A进行范围查询,查询的记录条数为3条,同时事务B也按相同的查询条件去查,也查出了3条记录,紧接着,事务A在这个范围中插入了一条记录,并提交了事务,那么此时数据库的条数就变成了4条,而事务B再次去查的时候就是4条记录,就和之前查询的记录数量不一致了,这种现象就是幻读

4 那什么又是隔离级别,有哪几种隔离级别呢?

首先我们要知道 正是因为事务在并发执行的过程中可能会遇到上面的各种问题–即脏读,幻读,不可重复读,也就是会对事务的一致性产生不同程度的影响,所以才引入隔离级别来去解决这些问题

有哪几种隔离级别-有读未提交,读已提交,可重复读,串行化四种隔离级别,隔离级别是由低到高,同时隔离级别越高,性能也就越差
读未提交:最低的隔离级别,也就是允许读取尚未提交的数据变更,可能会发生脏读,幻读或者不可重复读
读已提交:见名知义-即允许读取并发事务中已经提交的数据,可能会发生幻读或者不可重复读
可重复读:对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
串行化: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是性能最差

这里需要注意的是:
Mysql 默认采用的 REPEATABLE_READ隔离级别
Oracle 默认采用的 READ_COMMITTED隔离级别
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多
版本并发控制)
通过undo log版本链和readview机制来支持并发一致性读和回滚等特
性。

因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是
READ-COMMITTED(读取提交内容):,
但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)并不会有任何性能损失。
InnoDB 存储引擎在 分布式事务 的情况下一般会用到
SERIALIZABLE(可串行
化)**隔离级别。

5 MVCC机制了解吗?

首先我们要理解mvcc多版本并发控制,它其实主要是为了解决在RC,RR这种隔离级别下,读和写并发冲突的问题
这里的多版本就是多个undo日志版本链,
只要你对数据做了修改,不管你有没有提交 它都会加入到版本链中去,每条记录-id 都有自己的版本链
在这里插入图片描述
ReadView 是针对当前事务的,RR隔离级别下也就是说当你开启一个事务,进行查询的时候
它在那一刻查询到的readview 和你之后查询到的都是一样的,
注意你执行了更新操作,那其实是执行了当前读,之后这个视图再去查询,查询到的这条记录都是你更新后的。 但是注意readview并没有变,如果你查询其他的记录,还是需要拿着readview根据可见性视图算法规则去查找
而RC隔离级别是每一次查询都会查到当前最新的readview视图,都取了当前事务活跃事务和未活跃事务的状态

在这里插入图片描述
在可重复读隔离级别,当事务开启,执行任何查询sql时会生成当前事务的一致性视图read-view,该视图在事务结束之前永远都不会变化(如果是读已提交隔离级别在每次执行查询sql时都会重新生成read-view),这个视图由执行查询时所有未提交事务id数组(数组里最小的id为min_id)和已创建的最大事务id(max_id)组成,事务里的任何sql查询结果需要从对应版本链里的最新数据开始逐条跟read-view做比对从而得到最终的快照结果。
版本链比对规则:

  1. 如果 row 的 trx_id 落在绿色部分( trx_id<min_id ),表示这个版本是已提交的事务生成的,这个数据是可见的;
  2. 如果 row 的 trx_id 落在红色部分( trx_id>max_id ),表示这个版本是由将来启动的事务生成的,是不可见的(若 row 的 trx_id 就是当前自己的事务是可见的);
  3. 如果 row 的 trx_id 落在黄色部分(min_id <=trx_id<= max_id),那就包括两种情况
    a. 若 row 的 trx_id 在视图数组中,表示这个版本是由还没提交的事务生成的,不可见(若 row 的 trx_id 就是当前自己的事务是可见的);
    b. 若 row 的 trx_id 不在视图数组中,表示这个版本是已经提交了的事务生成的,可见。

所以RR隔离级别和RC隔离都是适用上述的可见性算法规则,区别只是查询到的readView视图不同

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模型评估:ROC曲线

二值分类器&#xff08;Binary Classifier&#xff09;是机器学习领域中最常见也是应用最广泛的分类器。评价二值分类器的指标很多&#xff0c;比如precision、recall、F1 score、P-R曲线等。相比而言&#xff0c;ROC曲线有很多优点&#xff0c;经常作为评估而知分类器最重要的…

GPT-4与DALL·E 3:跨界融合,开启绘画与文本的新纪元

在人工智能的发展浪潮中&#xff0c;MidTool&#xff08;https://www.aimidtool.com/&#xff09;的GPT-4与DALLE 3的集成代表了一个跨越式的进步。这一集成不仅仅是技术的结合&#xff0c;更是艺术与文字的完美融合&#xff0c;它为创意产业带来了革命性的变革。本文将探讨GPT…

鸿蒙原生应用再添新丁!京东入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;京东入局鸿蒙 来自 HarmonyOS 微博1月10日消息&#xff0c;#京东启动鸿蒙原生应用开发#&#xff01;优惠信息、派送进度都可以随时随地便捷查询。双方将携手为消费者带来全场景“多快好省”购物体验&#xff0c;更智能&#xff0c;更贴心&…

记录浏览器莫名其妙部分网页无法访问的一个解决办法

问题描述&#xff1a; 不知道什么原因&#xff0c;浏览器无法访问CSDN了&#xff0c;访问其他网站都可以正常加载。 经电脑网络诊断检测&#xff0c;反馈内容大致为&#xff1a; 资源处于联机状态但未对连接尝试做出响应&#xff0c;远程计算机不接受端口443上的连接。 测试…

基于实时Linux+FPGA实现NI CompactRIO系统详解

利用集成的软件工具链&#xff0c;结合信号调理I/O模块&#xff0c;轻松构建和部署实时应用程序。 什么是CompactRIO&#xff1f; CompactRIO系统提供了高处理性能、传感器专用I/O和紧密集成的软件工具&#xff0c;使其成为工业物联网、监测和控制应用的理想之选。实时处理器提…

order by之后的injection(sqllabs第四十六关)

order by相关注入知识 这一关的sql语句是利用的order by 根据输入的id不同数据排序不一样可以确定就是order by order by后面无法使用ubion注入&#xff08;靠找不到&#xff09; 可以利用后面的参数进行攻击 1&#xff09;数字 没作用考虑布尔类型 rand和select ***都可以 …

送水小程序开发:如何选择最适合的技术平台

选择最适合的技术平台对于开发送水小程序至关重要。在这篇文章中&#xff0c;我将为您介绍如何选择最适合的技术平台来开发送水小程序&#xff0c;以及各种技术平台的优缺点。无论您是刚刚起步的创业公司还是成熟的送水服务提供商&#xff0c;本文都将为您提供有关送水小程序开…

AIGC实战——改进循环神经网络

AIGC实战——改进循环神经网络 0. 前言1. 堆叠循环网络2. 门控制循环单元3. 双向单元相关链接 0. 前言 我们已经学习了如何训练长短期记忆网络 (Long Short-Term Memory Network, LSTM) 模型&#xff0c;以学习使用给定风格生成文本&#xff0c;接下来&#xff0c;我们将学习如…

pytorch10:正则化(weight_decay、dropout、Batch Normalization)

目录 一、正则化regularization1.概念2.过拟合3.减小方差策略4 正则化--权值衰减 二、正则化-dropout2.1 dropout概念2.2 数据尺度变化2.3 nn.Dropout2.4 两种模式 三、Batch Normalization3.1 ICS现象&#xff08;Internal Covariate Shift&#xff0c;内部协变量偏移)3.2 BN原…

uniapp在web端怎么使用svg图标呢

在图标库中添加好项目用到的图标&#xff0c;点击symbol点击生成在线链接 点击生成的在线链接&#xff0c;此时会跳转到一个新窗口&#xff0c;是一个js文件 复制这个js文件的内容 然后在uniapp中新建svg.js文件&#xff0c;把从上面复制的代码粘贴到这个svg.js中 在main.js中引…

楼宇管理新智慧:Panorama SCADA楼宇管理系统应用实例

一、背景介绍 楼宇管理系统旨在集中控制和监测楼宇运营&#xff0c;涵盖暖通空调&#xff08;HVAC&#xff09;、照明、电力系统、消防和安全系统等。通过直观的用户界面&#xff0c;用户得以实时监测和精准掌控这些系统&#xff0c;从而提升能源效率、确保设备正常运行&#…

哪种小型洗衣机好用?高性价比的小型洗衣机推荐

大型洗衣机作为家居必备小家电&#xff0c;对生活品质的提升十分显著&#xff0c;在很多人的认知中&#xff0c;这种大型洗衣机主要是用来清洁大件的衣服和外套的&#xff0c;不方便将内衣裤都放入到里面&#xff0c;内衣裤的材质和尺寸都是比较特殊&#xff0c;若是直接将其放…