mysql ACID 原理

news2025/6/3 1:20:47

序言:ACID 是一组数据库设计原则,他是业务数据和关键业务程序的可靠性保障。

1、atomicity(原子性)

依赖如下能力

autocommit
commit 
rollback

2、一致性

2.1 double write buffer
1、定义:double write buffer 是一块空间,mysql 将缓冲池的数据写入到此空间,然后 flush 到 mysql 数据存储空间。当 mysql 发生异常退出时,会从这个空间恢复数据。
2、可能问题:double write buffer 会造成两倍磁盘IO 吗?
不会,写入double write buffer 使用OS 调用 fsync()方法,每次写入一块大的 chunk 数据。(顺序 IO)
2.2 crash recovery

mysql 异常恢复分为如下几步进行

2.2.1 tablespace discovery
mysql 启动时会扫描tablespace空间,看是否有表需要 recovery。
2.2.1 redo log application

重要知识:checkpoint(检查点) 是 redo log 管理的核心机制之一。它的核心作用是 标记哪些数据修改已经持久化到磁盘,从而优化崩溃恢复的效率并回收 redo log 空间

1、redo log 存储方式:redo log,存储物理日志 记录数据页的变化(即第几页第几行变动),用于 mysql 程序异常退出后恢复。
redo log 在磁盘中是一系列文件,在事务成功提交并且写入后会被清理,此空间会重复使用
2、redo log 的写入:写入 redo log buffer,默认事务提交时强制刷盘 innodb_flush_log_at_trx_commit。(可每秒刷盘 0 ,OS 异步刷盘)

在这里插入图片描述

2.2.2 回滚未提交事务
2.2.3 change buffer merge
redo log 中会存储buffer pool 和 change buffer 中的数据,在 redo log 重放时,会根据 checkpoint 位置恢复对应的 change buffer
2.2.4 purge
清除被标记删除的,并且在所有事务中不可见的数据。

3、隔离性

3.1 隔离级别
1、REPEATABLE READ:事务开启时read snapshot,snapshot 在事务执行中不会变化,除非本事务使用 DML语句。 在执行 DQL,DML 语句时会使用 gap lock。这也是REPEATABLE READ减少幻读的核心。
2、READ COMMITTED:每次 read 都是读取最新的 snapshot,在 select,update delete 时根据 where 条件匹配到 row,然后使用 primary key 或者隐藏主键锁住 row,而不会使用 gap lock 锁住间隙。READ COMMITTED确保最终一致性,且会有更好的并发性能。
3、READ UNCOMMITTED:产生脏读,幻读,一般不用。
4、SERIALIZABLE:禁用并发。

3.2 data lock

4、持久性
mysql数据持久性主要和 redo log,double write buffer,bin log 相关联,除此之外,还与 mysq 服务所在的机器相关,如 CPU,OS,hardware。下面从 mysql 自身支持持久性分析:

1、如图可知 Redo Log 和 double write buffer的数据都来自 buffer pool 中的脏页,这两类数据都是以磁盘存储,buffer pool 是内存存储。
2、Redo log 和 double write buffer 都是 mysql 的恢复机制,当 mysql recovery 时首先从 double write buffer 恢复,如果恢复失败或者部分恢复,则会从 redo log 恢复。
3、innodb_flush_log_at_trx 参数的配置会影响 mysql 数据持久性,默认配置 1,Redo log 同步刷盘才返回客户端成功,其他两种情况均可能导致 mysql 丢失数据。
4、mysql server 层还有 bin log,它存储 mysql 事务提交后的每一条逻辑数据(SQL),常用做主从复制和数据同步。
下图是 mysql 写入数据时的流程图

在这里插入图片描述

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

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

相关文章

[Rust_1] 环境配置 | vs golang | 程序运行 | 包管理

目录 Rust 环境安装 GoLang和Rust 关于Go 关于Rust Rust vs. Go,优缺点 GoLang的优点 GoLang的缺点 Rust的优点 Rust的缺点 数据告诉我们什么? Rust和Go的主要区别 (1) 性能 (2) 并发性 (3) 内存安全性 (4) 开发速度 (5) 开发者体验 Ru…

二十五、面向对象底层逻辑-SpringMVC九大组件之HandlerMapping接口设计

一、引言:MVC架构的交通枢纽 在Spring MVC框架中,HandlerMapping接口扮演着"请求导航仪"的关键角色,它决定了HTTP请求如何被路由到对应的Controller处理器。作为MVC模式的核心组件之一,HandlerMapping在请求处理的生命…

HUAWEI交换机配置镜像口验证(eNSP)

技术术语: 流量观察口:就是我们常说的镜像口,被观察的流量的引流目的端口 流量源端口:企业生产端口,作为观察口观察对象。 命令介绍: [核心交换机]observe-port [观察端口ID或编号(数字&am…

前端vue3实现图片懒加载

场景和指令用法 场景:电商网站的首页通常会很长,用户不一定能访问到页面靠下面的图片,这类图片通过懒加载优化手段可以做到只有进入视口区域才发送图片请求 核心原理:图片进入视口才发送资源请求 首先:我们需要定义一个全局的指令&#x…

计算机网络-MPLS VPN应用场景与组网

上一篇文章我们通过一个基础实验实现了企业分支间的MPLS VPN互联,如果还不理解的可以多看几遍前面的文章或者多敲下实验。今天来学习几种常见的MPLS VPN应用场景与这些场景下MPLS VPN的部署方法。 一、MPLS VPN典型应用 目前,MPLS VPN的主要应用包括企…

Linux 的编辑器--vim

1.Linux编辑器-vim使⽤ vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以…

[Protobuf] 快速上手:安全高效的序列化指南

标题:[Protobuf] (1)快速上手 水墨不写bug 文章目录 一、什么是protobuf?二、protobuf的特点三、使用protobuf的过程?1、定义消息格式(.proto文件)(1)指定语法版本(2)package 声明符 2、使用protoc编译器生成代码&…

如何将通话记录从Android传输到Android

“如何将通话记录从 Android 转移到 Android?我换了一部新的 Android 手机,想要将通话记录复制到其中。”您需要将通话记录从 Android 传输到 Android 是一种常见的情况,因为通话记录是手机上最重要的数据之一。幸运的是,如果您从…

数据结构第4章 栈、队列和数组 (竟成)

目录 第 4 章 栈、队列和数组 4.1 栈 4.1.1 栈的基本概念 4.1.2 栈的基本操作 4.1.3 栈的实现 1.顺序栈 2.链式栈 3.共享栈 4.1.4 顺序栈的基本操作实现 1.初始化栈 2.判空 3.判满 4.元素进栈 5.元素出栈 6.获取栈顶元素 4.1.5 链栈的基本操作实现 1.元素进栈 2.元素出栈 4.1.6…

2025年渗透测试面试题总结-匿名[校招]安全研究员(SAST方向)(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 匿名[校招]安全研究员(SAST方向) 一面问题回答框架 1. 自我介绍 2. 简历深挖(漏洞挖掘&#x…

Unity 游戏优化(持续更新中...)

垃圾回收 是什么? 垃圾回收(Garbage Collection)GC 工作机制 1、Unity 为用户生成的代码和脚本采用了自动内存管理。 2、小块数据(如值类型的局部变量)分配在栈上。大块数据和长期存储分配在托管堆上。 3、垃圾收集…

20250529-C#知识:索引器

C#知识:索引器 索引器给对象添加了索引访问的功能,实际访问的是对象的成员,感觉不太常用。 1、主要内容及代码示例 索引器中类似属性,也包含get和set方法索引器能够使像访问数组一样访问对象一般当类中有数组类型的成员变量时&am…

【笔记】suna部署之获取 Tavily API key

#工作记录 Tavily 注册 Tavily 账号5: 打开浏览器,访问 Tavily 官网Tavily AI。点击页面上的 “注册” 按钮,按照提示填写注册信息,如邮箱地址、设置密码等,完成注册流程。也可以选择使用 Google 或 GitHub 账号授权登…

06-Web后端基础(java操作数据库)

1. 前言 在前面我们学习MySQL数据库时,都是利用图形化客户端工具(如:idea、datagrip),来操作数据库的。 我们做为后端程序开发人员,通常会使用Java程序来完成对数据库的操作。Java程序操作数据库的技术呢,有很多啊&a…

什么是单片机?

众所周知,人类行为受大脑调控,正如视觉、听觉、味觉、嗅觉、触觉及运动功能等感官与肢体活动均受其指挥;换言之,大脑作为人体的中枢神经系统,负责管理所有可控制的生理功能。 在电子设备领域,单片机…

Ubuntu的shell脚本

关于shell脚本 • shell脚本是文本的一种。 • shell脚本是可以运行的文本。 • shell脚本的内容是由说辑和数据组成。 • shell 脚本是解释型语言。 shell脚本存在的意义 Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具 Linux/UNIX系统…

从抄表到节能,电费管理系统如何重构公寓运营场景——仙盟创梦IDE

租房公寓电费管理系统是集智能计量、自动化计费、线上缴费、数据管理于一体的综合性解决方案,旨在解决传统电费管理中人工抄表误差大、收费效率低、纠纷频发等痛点。系统通过部署智能电表实时采集用电数据,结合云计算与大数据分析技术,实现电…

记一次前端逻辑绕过登录到内网挖掘

前言 在测试一个学校网站的时候,发现一个未授权访问内网系统,但是这个未授权并不是接口啥的,而是对前端 js 的审计和调试发现的漏洞,这里给大家分享一下这次的漏洞的过程。 进入内网的过程 可以看到是一个图书馆的网站&#xff…

Springboot 整合 WebSocket 实现聊天室功能

目录 前言一、WebSocket原理二、Spring Boot集成WebSocket2.1. 引入依赖2.2 配置类WebSocketConfig2.3 WebSocketServer 类2.4 前端代码 index.html2.5 Controller访问首页 前言 WebSocket概述: 在日常的web应用开发中,常见的是前端向后端发起请求&…

用 Trae IDE 打造一个桌面小爬虫:从 PyQt5 开始,轻松采集掘金首页内容

很多程序员都有这样的经历:刷掘金、看文章、找灵感、追热点。但你有没有想过,有一天让“爬虫”代替你去浏览这些内容?自动提取标题、作者、点赞数、评论数,一键生成你的专属“技术热点日报”。 今天我们就用 Trae IDE PyQt5 来完…