MySQL InnoDB引擎四大特性ACID实现方案分析

文章目录

    • 概要
    • InnoDb引擎ACID模型的实现方案
    • 小结

概要

对于Mysql,事物的支撑并不依赖于Server层,不同的存储引擎对于事物的支持也不一样,对于我们常用的InnoDB引擎,其提供了一套基于【ACID模型】的事物完整的解决方案。为什么MyISAM不支持事务了,因为MyISAM并没有基于ACID模型去提供整套的解决方案

所谓的ACID模式,就是我们常说的事物的四大特性。假如我问一个问题:事物和锁之间是什么关系?事物大家都知道,锁大家也都知道,但是这两个放在一块大家就不知道了,感觉有关系,但又说不上来哪里有关系。通过下面的文章分析,大家就能清晰的认识到他们两个之间的关系了。而不是网上给大家提供的模糊性的回答,锁是事物实现的一种机制这种。

  • 原子性(Atomicity)
    对于每个事务都是一个不可分割的最小工作单元,整个事务中的所有操作要么全部成功,要么全部失败,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

  • 一致性(Consistency)
    数据库从一个一致性的状态转换到另外一个一致性的状态。举个转账的例子:张三给李四转账100块,张三的账户扣减100,李四账户新增100,这个数据的总量的一致就是一致性的解释。不会转账失败而导致这个总量100出现不一致。

  • 隔离性(Isolation)
    隔离性是指当多个事务同时对数据库进行操作时,每个事务都是独立的,一个事务的操作不会影响到其他事务,对于不同的隔离级别,隔离性的实现方案也有所不同。

  • 持久性(Durability)
    一旦事务提交,则其所做的操作就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。

虽说是四大特性,但是他们之间并不平级,AID都是为了C(一致性服务的)
在这里插入图片描述

InnoDb引擎ACID模型的实现方案

  • 原子性的实现方法
    为了实现原子性的操作,InnoDB引擎在每次执行增删改查时,都需要先记录作反向操作undoLog,当执行过程中出现了异常,就会执行undoLog当中将sql的反向操作。这样就相当于所有的操作都没有执行,保证原子性。

  • 隔离性的实现方案
    隔离性分为写+写隔离,写+读隔离。写+写隔离通过锁来实现,写+读隔离通过MVVC来实现。
    为什么不能直接通过锁来实现隔离性了?这个就设计到多线程并发访问的问题。举个例子:如果我们只通过锁来解决隔离性,假设我们的隔离级别为可重复读。如下图:不论怎么利用锁,我们都是无法在二次读取时还能读取到zhangsan这个数据。有的小伙伴可能说,我可以加一个S锁呀,防止其他的线程加X锁。但是这样的话执行流程不就串行化了嘛,其他线程想修改数据必须得等S锁释放,不然会被阻塞。所以为了应对这种场景,我们就引入了MVCC机制。
    在这里插入图片描述

  • 持久性解决方案
    mysql在哪些执行过程会导致持久性异常了?我们在写数据时,mysqlServer端正打算往数据库的idb文件当做做刷盘处理时,机器突然异常掉电或者其他的意外,在没有持久性解决方案时就会出现刷盘异常,此时我们就需要引入redoLog来实现持久性解决方案。

  • 一致性的解决方案依托于上面的三个解决方案,当保证了AID的,我们的一致性就解决了

小结

基于上述的理解,我们就可以知道mysql的事物的四大特性的实现方案,也清楚了为什么只有InnoDB引擎才能实现事务,而MyISAM不支持事务的原因。因为InnoDB引擎基于事务的四大特性都实现了具体的解决方案,如果其他的存储引擎如果想要满足事务的话,也可以去根据ACID模型去实现自己的解决方案即可。而且通过分析我们也大致了解,InnoDB通过什么技术方案去实现了ACID模型。方便我们对于事物,锁这有都有一个基础的认知,我们需要对这些概念清晰了,后续才可以更方便的学习。

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

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

相关文章

云计算实训32——安装nginx(修改端口为8080)、roles基本用法、使用剧本安装nginx、使用roles实现lnmp

一、安装nginx并更改其端口 编辑hosts配置文件 [rootmo ~]# vim /etc/ansible/hosts 创建目录 [rootmo ~]# mkdir /etc/ansible/playbook 编辑配置文件 [rootmo ~]# vim /etc/ansible/playbook/nginx.yml 执行测试 [rootmo ~]# ansible-playbook /etc/ansible/playbook/n…

华为od(D卷)二叉树计算

文章目录 题目描述输入描述输出描述示例1思路代码 题目描述 给出一个二叉树如下图所示: 6/ \7 9\ / -2 6 请由该二叉树生成一个新的二叉树,它满足其树中的每个节点将包含原始树中的左子树和右子树的和。 20 (7-296)/ \-2 6\ / 0 0 左子树…

有源音箱申请Hi-Res认证指南

有源音箱(也称为主动式音箱)是一种内置功率放大器的音箱,其显著特点是音箱内部含有一套功率放大电路,可以直接通过音频线(如RCA线、3.5mm音频线或莲花线)与信号源(如电视、电脑、DVD播放器等&am…

详细扒一扒css的背景渐变(通俗易懂)

前言: CSS 渐变使您可以显示两种或多种指定颜色之间的平滑过渡。 CSS 定义了两种渐变类型: 线性渐变(向下/向上/向左/向右/对角线)径向渐变(由其中心定义) 下面来详细看看吧~ 🌈🌈文…

【知识分享】ubuntu22.04-ESP32环境搭建

文章目录 一、概要二、环境及工具介绍三、名词解释四、环境搭建 一、概要 手上有一块安信可的WIFI开发板,用的是乐鑫的ESP32模组。刚好最新装了双系统,貌似在Linux环境使用gcc编译器会快一些。     万事开头难,要在Linux环境下进行开发工…

[数据集][目标检测]瞳孔虹膜检测数据集VOC+YOLO格式8768张2类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):8768 标注数量(xml文件个数):8768 标注数量(txt文件个数):8768 标注…

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(二)---ROS2与UE5进行图像数据传输

前言 本系列教程旨在使用UE5配置一个具备激光雷达深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博…

thinkphp8 定时任务 addOption

在ThinkPHP8中&#xff0c;我们可以使用addOption方法来添加命令行选项。这个方法允许我们为命令行应用程序定义可接受的选项和参数。 以下是一个简单的例子&#xff0c;演示如何在ThinkPHP8中为命令行应用程序添加一个选项&#xff1a; <?php namespace app\command;use…

【git 第一篇章】版本控制之GIT

Git是一种分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。以下是Git的详细介绍&#xff1a; 一、Git的基本概念 分布式&#xff1a;Git的最大特点之一是它的分布式设计。这意味着每个开发者都拥有完整的代码仓库&#xff0c;包含项目的全部历史记录。…

【MySQL进阶之路】表的约束——主键,自增长,唯一键,外键

目录 主键 复合主键 自增长 唯一键 unique 外键 方案一 方案二 方案三 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 主键 主键&#xff1a;primary key用来唯一的约束该字段里面的数据&#xff0c;不能重复&#xff0c;不能为空&#xff08;必须有非空约束&#xf…

js高阶 -- 总结 03(小白)

严格模式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

微知-lspci如何查看pcie设备树状结构(-t)

对于查看pcie设备列表除了看是否存在 还需要看拓扑结构。如何看&#xff1f; lspci -t以减号为分割说明 第一列数字是域段 和 bus id。比如0000:00中0000是域 00是busid 第二列 01.2中01是device id。2是functionid 如果还有下游设备device还有一个指定busid的序号

传统的进程间通信——管道通信

传统的进程间通信——管道通信 管道是UNIX系统中最古老的进程间通信方式&#xff0c;是一种特殊文件读写机制 当进程从管道文件中读取数据时&#xff0c;如果管道中没有数据则进程会进入阻塞状态&#xff0c;直到有数据读取出来才返回&#xff0c;因此不需要借助信号、文件锁来…

Postman文件上传接口测试

接口介绍 返回示例 测试步骤 1.添加一个新请求&#xff0c;修改请求名&#xff0c;填写URL&#xff0c;选择请求方式 2.将剩下的media参数放在请求body里&#xff0c;选择form-data&#xff0c;选择key右边的类型为file类型&#xff0c;就会出现选择文件的按钮Select Files&a…

QT翻金币小游戏(含音频图片文件资源)

目录 QT翻金币小游戏 音频图片资源文件获取 效果展示 图片 视频 实现代码 main.cpp mymainwindow.h mymainwindow.cpp startscene.h startscene.cpp selectscene.cpp playscene.h playscene.cpp mypushbutton.h mypushbutton.cpp dataconfig.h dataconfig.cpp QT…

大模型时代,云南白药如何成为一家AI医药企业?|产业AI案例

作者|斗斗 编辑|皮爷 出品|产业家 中医药大模型发布&#xff1b;英伟达成立AI制药部门&#xff0c;发力生物制药领域&#xff1b;赛诺菲与百图生科达成战略合作&#xff0c;共同开发用于生物治疗药物发现的领先模型&#xff1b;京东发布医疗大模型&#xff1b;百度“产业级”…

读软件开发安全之道:概念、设计与实施04缓解

1. 缓解 1.1. 安全思维转换为有效行动的方法就是首先预判威胁&#xff0c;然后针对可能的漏洞加以保护 1.2. 主动响应的做法就叫做“缓解” 1.2.1. mitigation 1.2.2. 喂宝宝的时候给孩子围上围嘴&#xff0c;避免掉下来的食物粘在宝宝的衣服上&#xff0c;还有安全带、限速…

ansync/await 运行流程图

1、流程图&#xff1a; 2、await 之后的方法是何时执行&#xff0c;如何执行的&#xff1f; await 的方法在 Task 执行完成之后&#xff0c;通过调用 Finish 方法执行的。 具体的执行步骤是先将 MoveNext 方法注册到 Task 的回调里&#xff0c;然后在 Task 执行完后调用这个方法…

ID3算法详解:构建决策树的利器

目录 引言 ID3算法概述 算法基础 信息熵 ​编辑 信息增益 ID3算法步骤 决策树 概念: 核心&#xff1a; 节点 1. 根节点 2. 非叶子节点 3. 叶子节点 引言 在机器学习领域&#xff0c;决策树是一种非常流行的分类和回归方法。其中&#xff0c;ID3算法作为决策树算法…

jenkins最佳实践(二):Pipeline流水线部署springCloud微服务项目

各位小伙伴们大家好呀&#xff0c;我是小金&#xff0c;本篇文章我们将介绍如何使用Pipeline流水线部署我们自己的微服务项目&#xff0c;之前没怎么搞过部署相关的&#xff0c;以至于构建流水线的过程中中也遇到了很多自己以前没有考虑过的问题&#xff0c;特写此篇&#xff0…