MySQL面试题-事务(答案版)

news2024/12/22 9:11:49

在这里插入图片描述

事务

1、事务与存储引擎的关系

事务是由 MySQL 的引擎来实现的,我们常见的 InnoDB 引擎它是支持事务的。

不过并不是所有的引擎都能支持事务,比如 MySQL 原生的 MyISAM 引擎就不支持事务,也正是这样,所以大多数 MySQL 的引擎都是用 InnoDB。

2、事务的特性

(1)原子性:一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
(2)一致性:是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
(3)隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。
(4)持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3、事务特性的实现方式

(1)持久性是通过 redo log (重做日志)来保证的;
(2)原子性是通过 undo log(回滚日志) 来保证的;
(3)隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
(4)一致性则是通过持久性+原子性+隔离性来保证;

4、并行事务会引发什么问题?

(1)如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。
(2)在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。
(3)在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。

5、事务的隔离级别有哪些?

(1)读未提交:指一个事务还没提交时,它做的变更就能被其他事务看到;
(2)读提交:指一个事务提交之后,它做的变更才能被其他事务看到;
(3)可重复读:指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的。
(4)串行化:会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;

在「读未提交」隔离级别下,可能发生脏读、不可重复读和幻读现象;
在「读提交」隔离级别下,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;
在「可重复读」隔离级别下,可能发生幻读现象,但是不可能脏读和不可重复读现象;
在「串行化」隔离级别下,脏读、不可重复读和幻读现象都不可能会发生。

6、MySQL的InnoDB引擎是怎么解决幻读问题的?

(1)针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
(2)针对当前读(select … for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。

7、四种隔离级别具体是如何实现的呢?

(1)对于「读未提交」隔离级别的事务来说,因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;
(2)对于「串行化」隔离级别的事务来说,通过加读写锁的方式来避免并行访问;
(3)对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同。

「读提交」隔离级别是在「每个语句执行前」都会重新生成一个 Read View
「可重复读」隔离级别是「启动事务时」生成一个 Read View,然后整个事务期间都在用这个 Read View。

执行「开始事务」命令,并不意味着启动了事务。在 MySQL 有两种开启事务的命令,分别是:

begin/start transaction 命令;
start transaction with consistent snapshot 命令;

这两种开启事务的命令,事务的启动时机是不同的:

执行了 begin/start transaction 命令后,并不代表事务启动了。只有在执行这个命令后,执行了增删查改操作的 SQL 语句,才是事务真正启动的时机;
执行了 start transaction with consistent snapshot 命令,就会马上启动事务。

8、具体谈谈Read View

(1)Read View 中四个字段作用;

m_ids :指的是在创建 Read View 时,当前数据库中「活跃事务」的事务 id 列表,注意是一个列表,“活跃事务”指的就是,启动了但还没提交的事务。
min_trx_id :指的是在创建 Read View 时,当前数据库中「活跃事务」中事务 id 最小的事务,也就是 m_ids 的最小值。
max_trx_id :这个并不是 m_ids 的最大值,而是创建 Read View 时当前数据库中应该给下一个事务的 id 值,也就是全局事务中最大的事务 id 值 + 1;
creator_trx_id :指的是创建该 Read View 的事务的事务 id。

(2)聚簇索引记录中两个跟事务有关的隐藏列;

trx_id,当一个事务对某条聚簇索引记录进行改动时,就会把该事务的事务 id 记录在 trx_id 隐藏列里;
roll_pointer,每次对某条聚簇索引记录进行改动时,都会把旧版本的记录写入到 undo 日志中,然后这个隐藏列是个指针,指向每一个旧版本记录,于是就可以通过它找到修改前的记录。

(3)MVCC流程

如果记录的 trx_id 值小于 Read View 中的 min_trx_id 值,表示这个版本的记录是在创建 Read View 前已经提交的事务生成的,所以该版本的记录对当前事务可见。
如果记录的 trx_id 值大于等于 Read View 中的 max_trx_id 值,表示这个版本的记录是在创建 Read View 后才启动的事务生成的,所以该版本的记录对当前事务不可见。
如果记录的 trx_id 值在 Read View 的 min_trx_id 和 max_trx_id 之间,需要判断 trx_id 是否在 m_ids 列表中:在 m_ids 列表中则不可见,不在m_ids列表中则可见。
这种通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制)。

9、可重复读隔离级别下完全解决幻读了嘛?

可重复读隔离级别下虽然很大程度上避免了幻读,但是还是没有能完全解决幻读。

可重复读幻读情况一:

// 事务A
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t_stu where id = 5;
Empty set (0.01 sec)
// 事务B
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t_stu values(5, '小美', 18);
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
// 事务A
mysql> update t_stu set name = '小林coding' where id = 5;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from t_stu where id = 5;
+----+--------------+------+
| id | name         | age  |
+----+--------------+------+
|  5 | 小林coding   |   18 |
+----+--------------+------+

在可重复读隔离级别下,事务 A 第一次执行普通的 select 语句时生成了一个 ReadView,之后事务 B 向表中新插入了一条 id = 5 的记录并提交。接着,事务 A 对 id = 5 这条记录进行了更新操作,在这个时刻,这条新记录的 trx_id 隐藏列的值就变成了事务 A 的事务 id,之后事务 A 再使用普通 select 语句去查询这条记录时就可以看到这条记录了,于是就发生了幻读。

可重复读幻读情况二:

01-T1 时刻:事务 A 先执行「快照读语句」:select * from t_test where id > 100 得到了 3 条记录。
02.T2 时刻:事务 B 往插入一个 id= 200 的记录并提交;
03.T3 时刻:事务 A 再执行「当前读语句」 select * from t_test where id > 100 for update 就会得到 4 条记录,此时也发生了幻读现象。

要避免这类特殊场景下发生幻读的现象的话,就是尽量在开启事务之后,马上执行 select … for update 这类当前读的语句,因为它会对记录加 next-key lock,从而避免其他事务插入一条新记录。

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

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

相关文章

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库+报告+uml等图源文件+指导书

hnust 湖南科技大学 2023 综合实训3(软件工程)课设 完整代码及数据库报告uml等图源文件指导书 介绍 老师考核等级为优,系统多次测试,未发现bug 项目前后端分离,前端vue2工程项目,后端springboot&#xff…

知乎语音下载(mediadown)

知乎语音下载(mediadown) 一、介绍 知乎语音下载,能够帮助你下载知乎知学堂课程中的语音和视频。它不能帮你越过会员权限,下载你没权限访问的语音和视频。 二、下载地址 本站下载:知乎语音下载(mediadown) 百度网盘下载:知乎语音下载(mediadown) 三、安装教程 …

创业者的智选:知识付费小程序定制开发服务解析

探索知识付费领域的新时代,选择专业的知识付费小程序定制开发服务,打造个性化、高效的知识传播平台。无论您是企业、机构还是个体创作者,都能助您成功变现知识资产。 知识付费小程序的开发是一个涉及多方面技术的综合性工程。下面提供一些关…

利用redis实现秒杀功能

6、秒杀优化 这个是 图灵 的redis实战里面的一个案例 6.1 秒杀优化-异步秒杀思路 我们来回顾一下下单流程 当用户发起请求,此时会请求nginx,nginx会访问到tomcat,而tomcat中的程序,会进行串行操作,分成如下几个步骤…

Linux:Kubernetes(k8s)基础理论笔记(1)

我笔记来源的图片以及共享至GitHub,本章纯理论。这是k8s中部分的基础理论 👇 KALItarro/k8spdf: 这个里面只有一个pdf文件 (github.com)https://github.com/KALItarro/k8spdf👆 什么是kubernetes kubernetes 是一个开源的,用于管…

二、TensorFlow结构分析(1)

目录 1、TF数据流图 1.1 TensorFlow结构分析 1.2 案例 2、图与TensorBoard 2.1 图结构 2.2 图相关操作 2.2.1 默认图 2.2.2 创建图 2.3 TensorBoard:可视化学习 2.3.1 数据序列化 - events文件 2.3.2 启动TensorBoard 2.4 OP 2.4.1 常见OP 2.4.2 指令…

呵护宝贝的肌肤当然要从小做起啦~

亲子系列~来个防晒衣 防晒还真的挺重要的 尤其是女生,防晒要从小做起哈 这款做的防晒面料,有抗紫外线吊牌 可以放心去穿,质地柔软轻盈又透气 防晒护肤双合一,四个颜色每个都很好看 很适合春夏季,很干净清爽 泳衣…

LeetCode.232. 用栈实现队列

题目 232. 用栈实现队列 分析 先了解一下栈和队列的特点: 栈:先进后出队列:先进先出 想用栈实现队列的特点,就需要使用两个栈。因为两个栈就可以将列表倒序。 假设第一个栈 s1 [1,2,3],第二个栈 s2 [] 。若循环…

外卖点餐多门店商家积分商城小程序开发

开源版的点餐外卖多门店多商家积分商城小程序是一款集合了多种功能于一身的移动应用。以下是该小程序的核心功能概述: 点餐与外卖服务:用户能够轻松浏览不同门店的菜单,根据个人口味和需求挑选菜品、口味和规格,并将其加入购物车…

高通QNX基线编译原理

下面代码以高通智驾平台为例。 1 QNX应用程序编译原理 在高通提供的qnx开发包中,qnx的内核已经由qnx所提供,所以qnx的编译,其实就是大量应用程序的编译,以及最后利用buildfile文件,把内核,库文件以及应用程序打包在一起的过程。 1.1 qnx的工程目录 应用程序的编译,可…

AirPods Pro 2 耳机推送新固件,苹果Find My功能助力产品成长

苹果公司面向 AirPods Pro 2(包括 USB-C 和 Lightning 版本),推出了全新的测试版固件更新,版本号为 6E188,高于 12 月份发布的 6B34 固件。 苹果和往常一样,并没有提供详细的更新日志或者说明&#xff0c…

mirthConnect忽略HTTPS SSL验证

mirthConnect SSL忽略验证 1、下载https网站证书 点击不安全---->证书无效 2、查看mirth 秘钥库口令 在mirthConnect 的conf目录下面keystore.storepass 3、导入证书到本地 在jdk的bin目录下面执行 keytool -importcert -file "下载的网站证书路径" -keysto…

MyBatisPlus(SpringBoot版)的分页插件

目录 一、前置工作: 1.整体项目目录结构 2.创建普通javamaven项目。 3.导入依赖,改造成springboot项目 4.配置启动类 5.创建service接口及其实现类 6.创建接口Mapper 7.配置数据源 8.创建数据库表 二、使用MP(mybatisplus)的分页插件 二、使…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中,流行的联合显着性(JS)检验会产生过于保守的 I 类错误率,因此功效较低。但是,如果在使用 JS 测试高维中介假设时,可以准确控制…

一站式电商数据采集API接口-支持多平台采集-全面提升数据采集效率!

电商数据采集API接口包含:淘宝采集,天猫采集,拼多多采集,同行店采集,蓝海店铺采集,批量整店采集,蓝海监控上新,首销尾销,潜力款选品,上新品采集,高…

RNA-Seq 笔记 [4]

***********************该笔记为初学者笔记,仅供个人参考谨慎搬运代码****************************** samtools 排序压缩和 featureCounts 生成基因计数表 SAM文件和BAM文件 1.SAM格式:是一种通用的比对格式,用来存储reads到参考序列的比…

【蓝牙协议栈】【BR/EDR】【AVDTP】音视频分布传输协议

1. AVDTP概念 AVDTP即 AUDIO/VIDEO DISTRIBUTION TRANSPORT PROTOCOL(音视频分配传输协议),主要负责 A/V stream的协商、建立及传输程序,还指定了设备之前传输A/V stream的消息格式. AVDTP的传输机制和消息格式是以 RTP为基础的。…

Redis 之三:Redis 的发布订阅(pub/sub)

概念介绍 Redis 发布订阅 (pub/sub) 是一种消息通信模式,它允许客户端之间进行异步的消息传递 Redis 客户端可以订阅任意数量的频道。 模型中的角色 在该模型中,有三种角色: 发布者(Publisher):负责发送信…

vue2 element 实现表格点击详情,返回时保留查询参数

先直观一点,上图 列表共5条数据,准备输入Author过滤条件进行查询 进入查看详情页,就随便搞了个按钮 啥都没调啦 点击返回后 一开始准备用vuex做这个功能,后来放弃了,想到直接用路由去做可能也不错。有时间再整一套…

【VTKExamples::PolyData】第四十四期 ProcurstesAlignmentFilter

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例ProcurstesAlignmentFilter,并解析接口vtkProcurstesAlignmentFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…