一文说明白 MySQL 的 ACID 和 几种日志的关系

1、简介

        我们对于MySQL 很熟悉,关于其特性都有一定的了解,但是关于一些具体的实现原理,有的小伙伴可能不太熟悉,而且这部分知识在我们互联网大厂面试中是经常涉及的,因此,本文将带你深入底层,顺利通过面试。

2、MySQL 的四大特性 ACID
2.1、原子性(Atomicity)

        原子性是指一个事务是一个不可分割的整体,在一个事务的中的操作,要么全部成功,要么全部失败,保持整体一致。

2.2、一致性 (Consistency)

           一致性是指事务执行前后,数据处于一种合法的状态,这种状态是语义上的而不是语法上的。 这个状态是满足预定的约束就叫做合法的状态,再通俗一点,这状态是由你自己来定义的。满足这个状态,数据就是一致的,不满足这个状态,数据就是不一致的!

2.3、隔离性 (Isolation)

        隔离性是指多个事务并发执行的时候,一个事务内部的操作与其他事务是相互隔离的,并发执行的各个事务之间不能互相干扰。

2.3.1、隔离级别

1)、read uncommitted (读未提交):两个事务之间能够相互读取对方的修改未提交的数据(会产生脏读)

2)、read committed (读已提交):一个事物在操作过程中,能够读取另一个事务已提交的数据(会产生不可重复读)

3)、Repeatable read(可重复度):在第一次读取操作时生成 ReadView,并且对于记录的更新操作,会对每一条被更新的记录加上next-key锁(等价于行锁+间隙锁)。(会产生幻读)

4)、Serializable(串行化):一个事务一个事务按顺序执行,不会产生任何问题,但是效率低。

2.3.2、数据库隔离级别操作
# 查看数据库的隔离级别 
show variables like '%isolation%' # 在 MySQL 数据库中,默认的事务隔离级别是 REPEATABLE READ
# 设置隔离级别
set session/global transaction isolation level 隔离级别;
2.4、持久性 (Durability)

        持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

3、几种特性实现原理
3.1、原子性(undo log 实现)

        原子性的实现利用 Innodb 的 undo log。 undo log名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的sql语句,他需要记录你要回滚的相应日志信息。

例如:
1)、当你delete一条数据时,就需要记录这条数据操作信息,回滚的时候,insert这条旧数据。
2)、当你update一条数据时,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作。
3)、当年insert一条数据时,就需要这条记录的主键,回滚的时候,根据主键执行delete操作。

        undo log记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undo log中的信息将数据回滚到修改之前的样子。

3.2、一致性

        从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。

3.3、隔离性(undo log 实现)

        隔离性的实现利用的是MVCC机制。MVCC(多版本并发控制:Multi Version Concurrency Control),一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。 如果一个事务读取的行正在做DELELE或者UPDATE操作,读取操作不会等行上的锁释放,而是读取该行的快照版本。

注意:在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。

3.4、持久化(redo log实现)

        当做数据修改的时候,不仅在内存中操作,还会在redo log中记录这次操作。当事务提交的时候,会将redo log日志进行刷盘(redo log一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redo log中的内容恢复到数据库中,再根据 undo log 和 binlog 内容决定回滚数据还是提交数据。

redo log 特点:

1)、redo log体积小,毕竟只记录了哪一页修改了啥(物理记录),因此体积小,刷盘快。

2)、redo log是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。

3.5、二进制日志文件(binlog)

        关于二进制文件的详细说明,参考博客:MySQL 和 Redis 如何保证数据一致性,通过MySQL的binlog实现-CSDN博客

4、总结

         本文详细介绍了MySQL的四大特性和隔离级别相关知识,关于如何实现 MVCC 机制敬请关注后续内容更新,以上知识点是我们在面试过程中经常遇到的问题,掌握原理能够让我们更好使用MySQL。

        本人是一个从小白自学计算机技术,对运维、后端、各种中间件技术、大数据等有一定的学习心得,想获取自学总结资料(pdf版本)或者希望共同学习,关注微信公众号:it自学社团。后台回复相应技术名称/技术点即可获得。(本人学习宗旨:学会了就要免费分享)

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

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

相关文章

力扣日记1.19-【二叉树篇】538. 把二叉搜索树转换为累加树

力扣日记:【二叉树篇】538. 把二叉搜索树转换为累加树 日期:2023.1.19 参考:代码随想录、力扣 ps:因为准备组会汇报又搁置了好久(其实就是懒逃避T^T),但这是最后一道二叉树啦啊啊啊!&#xff01…

递归、搜索与回溯算法(专题六:记忆化搜索)

目录 1. 什么是记忆化搜索(例子:斐波那契数) 1.1 解法一:递归 1.2 解法二:记忆化搜索 1.2.1 记忆化搜索比递归多了什么? 1.2.2 提出一个问题:什么时候要使用记忆化搜索呢? 1.3 …

第十三章 MySQL

第十三章 MySQL 下面是创建数据库操作 删除数据库 右上角选择要操作的数据库 如果关闭了这个控制台,下次如何找到它呢 也可以对其改名

Linux环境下,针对QT软件工程搭建C++Test单元测试环境的操作指南

文章目录 前言一、安装QT二、安装CTest三、使用QT生成.bdf文件四、创建CTest工程注意事项 前言 CTest是Parasoft公司出品的一款可以针对C/C源代码进行静态分析、单元测试、集成测试的测试工具。本文主要讲解如何在Linux环境下,搭建QT插件版的CTest测试环境。 一、…

java测简单案例定时器和netty心跳检

一,定时器的实现方式 在Java中,定时器可以通过多种方式实现,其中最常用的是使用java.util.Timer和java.util.TimerTask类。下面是一个简单的示例,演示如何使用这些类来创建一个定时器。 首先,我们需要创建一个继承自…

Android源码编译和刷机

目录 1. Android源码编译备注2. Android源码刷机1. Android源码编译 1. 下载对应设备版本的驱动。 https://source.android.com/setup/start/build-numbers 找到需要的android版本号和对应的设备驱动号(例:android-9.0.0_r46 PQ3A.190801.002)https://developers.google.com…

【b站咸虾米】chapter4_vue组件_新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握

课程地址:【新课uniapp零基础入门到项目打包(微信小程序/H5/vue/安卓apk)全掌握】 https://www.bilibili.com/video/BV1mT411K7nW/?p12&share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 四、vue组件 uni-app官网 …

如何解决态势感知中的“时隐时现”问题

解决态势感知中的“时隐时现”问题有以下几个方法: 1、确保所有关键的监控设备和传感器正常运行,能够及时和准确地检测到各种异常情况。 2、引入先进的技术手段。例如使用人工智能和机器学习算法来识别和分析大量的数据,快速发现异常和威胁&a…

RabbitMQ的基本使用,进行实例案例的消息队列

目录 一、介绍 1. 概述 2. 作用 3. 工作原理 二、RabbitMQ安装部署 1. 安装 2. 部署 3. 增加用户 三、实现案例 1. 项目创建 2. 项目配置 3. 生产者代码 4. 消费者代码 四、测试 每篇一获 一、介绍 1. 概述 RabbitMQ 是一种开源的消息代理和队列服务器&#x…

Spring Web文件上传功能简述

文章目录 正文简单文件上传文件写入 总结 正文 在日常项目开发过程中,文件上传是一个非常常见的功能,当然正规项目都有专门的文件服务器保存上传的文件,实际只需要保存文件路径链接到数据库中即可,但在小型项目中可能没有专门的文…

LeetCode 2894. 分类求和并作差

给你两个正整数 n 和 m 。 现定义两个整数 num1 和 num2 ,如下所示: num1:范围 [1, n] 内所有 无法被 m 整除 的整数之和。 num2:范围 [1, n] 内所有 能够被 m 整除 的整数之和。 返回整数 num1 - num2 。 示例 1: …

vector的定义与遍历

一、vector的定义&#xff1a; 1、导入#include 2、vector<数据类型> 变量名 3、赋值方式&#xff1a; 变量名.push_back(); #include<iostream> #include<vector> #include<algorithm> using namespace std; void test02(int val){cout << val…

Oracle命令大全

文章目录 1. SQL*Plus命令&#xff08;用于连接与管理Oracle数据库&#xff09;2. SQL数据定义语言&#xff08;DDL&#xff09;命令3. SQL数据操作语言&#xff08;DML&#xff09;命令4. PL/SQL程序块5. 系统用户管理6. 数据备份与恢复相关命令1. SQL*Plus命令&#xff08;用…

西门子燃烧控制器维修LMV37.410A2WH

西门子燃烧控制器维修范围包括&#xff1a; LMV系列燃烧器控制系统维修 LMV5系列控制器维修 AZL系列显示操作单元维修 QRI系列火焰探测器维修 SQM4系列电动执行机构维修 AZL系列或其他控制系统维修或设置燃烧器的启停&#xff0c;燃料&#xff0c;运行模式&#xff0c;运行…

基于网络爬虫的微博热点分析,包括文本分析和主题分析

基于Python的网络爬虫的微博热点分析是一项技术上具有挑战性的任务。我们使用requests库来获取微博热点数据&#xff0c;并使用pandas对数据进行处理和分析。为了更好地理解微博热点话题&#xff0c;我们采用LDA主题分析方法&#xff0c;结合jieba分词工具将文本分割成有意义的…

配置zabbix平台对数据库以及主从状态的监控

引言&#xff1a;明人不说暗话&#xff0c;今天分享下配置zabbix平台对数据库以及主从状态的监控 准备好zabbix监控平台&#xff08;zabbix-server端&#xff09;例10.12.153.235 db1客户端&#xff08;zabbix-agent&#xff09;例10.12.153.73 1.安装Zabbix存储库 # rpm -Uv…

PDF.js - 免费开源的 JavaScript 读取、显示 PDF 文档的工具库,由 Mozilla 开发并且持续维护

最近新项目需要处理 PDF&#xff0c;研究了 PDf.js 之后觉得很不错&#xff0c;于是写篇文章推荐给大家。 PDF.js 的功能和它的名字一样简单&#xff0c;是一个使用 HTML5 技术来让前端网页支持读取、解析和显示 PDF 文档的 JS 工具库。这个项目由大名鼎鼎的 Mozilla 组织开发…

文件包含漏洞讲解

文件包含即程序通过包含函数调用本地或远程文件,以此来实现拓展功能。 基础编辑 本地文件包含 常见的文件包含漏洞的形式为 <?php include("inc/" . $_GET[file]); ?> 考虑常用的几种包含方式为 同目录包含file.htaccess目录遍历?file…/…/…/…/…/……

RabbitMQ安装和使用

简介 RabbitMQ是一套开源&#xff08;MPL&#xff09;的消息队列服务软件&#xff0c;是由LShift提供的一个Advanced Message Queuing Protocol (AMQP) 的开源实现&#xff0c;由以高性能、健壮以及可伸缩性出名的Erlang写成。所有主要的编程语言均有与代理接口通讯的客户端库…

JavaSE核心基础-循环嵌套-笔记

1.循环嵌套概述 循环嵌套&#xff1a;一个循环体内包含了另一个完整的循环结构&#xff0c;那么总共的循环次数 外循环次数 * 内循环次数。 2.循环嵌套分类 语法&#xff1a; for(初始化表达式①; 循环条件②; 步进表达式⑦) { for(初始化表达式③; 循环条…