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

news2025/1/10 1:31:14

事务

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.coloradmin.cn/o/1373702.html

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

相关文章

【sqlite3】sqlite3在linux下使用sqlitebrowser工具实现数据可视化

sqlite3在linux下使用sqlitebrowser工具实现数据可视化 1. ### install sqlitebrowser 1. ### install sqlitebrowser 安装指令 sudo apt-get install sqlitebrowser通过工具打开数据库 sqlitebrowser stereo.db打开效果

HTTPS详解及openssl简单使用

OpenSSL 中文手册 | OpenSSL 中文网 本文介绍https传输协议中涉及的概念&#xff0c;流程&#xff0c;算法&#xff0c;如何实现等相关内容。 HTTP传输过程 HTTP 之所以被 HTTPS 取代&#xff0c;最大的原因就是不安全&#xff0c;至于为什么不安全&#xff0c;看了下面这张图…

Linux第25步_在虚拟机中备份“ST官方的TF-A源码”

TF-A是ARM公司提供的&#xff0c;ST公司通过修改它&#xff0c;做了一个自己的TF-A代码。因为在后期开发中&#xff0c;若硬件被改变了&#xff0c;我们需要通过修改"ST官方的TF-A源码"就可以自己的TF-A代码了。为了防止源文件被误改了&#xff0c;我们需要将"S…

亲测,Chatgpt4.0充值(虚拟卡充值)

一、准备工作&#xff1a; 1、一个ChatGPT3.5账号 2、一张支持ChatGPT4.0的虚拟卡 二、流程【网页版充值】 充值前请先确认以下三点&#xff1a; 1&#xff0c;ChatGPT账户正常登陆。 2&#xff0c;充值过程中始终保持美区环境&#xff0c;且开启全局模式。 3&#xff0…

简洁计算器Python代码

简洁的Python计算器&#xff0c;直接上代码&#xff08;用时10分钟&#xff09;&#xff1a; Python Gui图形化开发探索GUI开发的无限可能&#xff0c;使用强大的PyQt5、默认的Tkinter和跨平台的Kivy等工具&#xff0c;让Python成为你构建应用程序的得力助手。从本机用户界面到…

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍

在 WinForms 应用程序中实现 FTP 文件操作及模式介绍 简介 在许多应用程序中&#xff0c;能够从远程服务器获取文件是一个非常有用的功能。本文将详细介绍如何在 Windows Forms (WinForms) 应用程序中使用 FTP 协议进行文件操作&#xff0c;包括连接到 FTP 服务器、列出目录、…

邂逅Node.JS的那一夜

邂逅Node.JS的那一夜&#x1f303; 本篇文章&#xff0c;学习记录于&#xff1a;尚硅谷&#x1f3a2; 本篇文章&#xff0c;并不完全适合小白&#xff0c;需要有一定的HTML、CSS、JS、HTTP、Web等知识及基础学习&#xff1a; &#x1f197;&#xff0c;紧接上文&#xff0c;…

通过反射修改MultipartFile类文件名

1、背景 项目上有这样一个需求&#xff0c;前端传文件过来&#xff0c;后端接收后按照特定格式对文件进行重命名。(修改文件名需求其实也可以在前端处理的) //接口类似于下面这个样子 PosMapping("/uploadFile") public R uploadFile(List<MultipartFile> fil…

Spring Boot注解大全:从入门到精通,轻松掌握Spring Boot核心注解!

目录 1、前言 2、介绍 2.1 Spring Boot简介 2.2 为什么要学习Spring Boot注解 3、Spring Boot基本注解 3.1 SpringBootApplication 3.2 EnableAutoConfiguration 3.3 ComponentScan 4、控制器注解 4.1 RestController 4.2 RequestMapping 4.3 PathVariable 4.4 Re…

主播风格的多样性

主播风格是主播在直播过程中表现出来的一种个性特点&#xff0c;它可以影响观众的感知和互动体验。以下是常见的几种主播风格: 1.时尚型:这种风格的主播通常穿着时尚、前卫&#xff0c;以潮流、新颖的形象出现在观众面前&#xff0c;善于捕捉时尚元素&#xff0c;并能够将其融…

JAVA销售数据决策管理系统源码

JAVA销售数据决策管理系统源码 基于BS&#xff08;Extjs Strus2springhibernate Mysql&#xff09;的销售数据的决策支持 主要的功能有 系统功能具体内容包括基础资料、进货管理、出货管理、库存管理、决策分析、系统管理。

基于书生·浦语大模型应用开发范式介绍

文章目录 大模型应用开发范式LangChain简介构建向量数据库搭建知识库助手RAG方案优化建议 大模型应用开发范式 通用大模型的优势&#xff1a; 强大的语言理解、指令跟随、语言生成的能力可以理解用户自然语言的指令具有强大的知识储备和一定的逻辑推理能力。 通用大模型局限…

springboot私人健身与教练预约管理系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

中国智造闪耀CES | 木牛科技在美国CES展亮相多领域毫米波雷达尖端方案

素有全球科技潮流“风向标”之称的2024国际消费类电子产品展&#xff08;CES&#xff09;&#xff0c;于1月9-12日在美国拉斯维加斯会议中心举办。CES是全球最大的消费电子和消费技术展览会之一&#xff0c;汇集了世界各地优秀的消费电子和科技公司&#xff0c;带着最好的产品来…

vue3中ref和reactive联系与区别以及如何选择

vue3中ref和reactive区别与联系 区别 1、ref既可定义基本数据类型&#xff0c;也可以定义引用数据类型&#xff0c;reactive只能定义应用数据类型 2、ref在js中取响应值需要使用 .value&#xff0c;而reactive则直接取用既可 3、ref定义的对象通过.value重新分配新对象时依旧…

Windows下上帝模式的实现

在windows系统上有个特殊模式&#xff0c;那就是上帝模式&#xff0c;几乎包含了windows中所有的快捷方式&#xff0c;有很多小伙伴还不知道&#xff0c;让我们一起来实现这一操作吧&#xff01; 一、首先新建一个文件夹 二、接着将文件夹重命名&#xff0c;命名为以下代码&am…

【OpenCV学习笔记07】- 【彩蛋】实现轨迹条控制画笔颜色和笔刷半径,并可以正常绘画

彩蛋 实现轨迹条控制画笔颜色和笔刷半径&#xff0c;并可以正常绘画。 直接上彩蛋代码 示例代码&#xff1a; # 彩蛋&#xff0c;创建一个可以调节颜色和笔刷半径的轨迹栏&#xff0c;并且可以通过鼠标进行绘画 import numpy as np import cv2 as cv# 定义全局变量 # 如果 …

Linux 文件(夹)权限查看

命令 : ls -al ls -al 是一个用于列出指定目录下所有文件和子目录的命令,包括隐藏文件和详细信息。其中,-a 选项表示显示所有文件,包括以 . 开头的隐藏文件,-l 选项表示以列表的形式显示文件的详细信息。 本例中:drwxrwxr-x 为权限细节。 权限细节(Permission detail…

高通rb5的fastboot设备识别不了及驱动安装问题

Android fastboot驱动无法安装和识别问题-CSDN博客 以上为转载出处。

软件启动,系统提示缺少d3dx9 26.dll怎么办?d3dx9 26.dll丢失修复方法

d3dx9_26.dll文件是微软公司开发的DirectX API的一部分。DirectX是一种使Windows操作系统能够高效执行多媒体和游戏程序的技术。更具体地说&#xff0c;d3dx9_26.dll是DirectX 9的一部分&#xff0c;它主要用于处理游戏中的复杂3D图形和丰富的声音效果。 d3dx9_26.dll文件的主要…