Mysql 中 ACID 背后的原理

news2025/4/7 3:24:31

MySQL 中,ACID 是事务处理的核心原则,用于保证数据库在执行事务时的可靠性、数据一致性和稳定性。ACID 是四个关键特性的首字母缩写,分别是:Atomicity(原子性)Consistency(一致性)Isolation(隔离性)Durability(持久性)

下面是每个特性背后的原理和 MySQL 如何实现这些特性。

1. 原子性(Atomicity)

原子性保证了一个事务中的操作要么全部成功,要么全部失败。事务中的操作不会被部分执行,也就是说如果事务中的某个操作失败,之前的所有操作都将被撤销,系统回到事务开始之前的状态。

原理:

  • Undo Log:InnoDB 使用 Undo Log 来支持原子性。每次事务执行时,InnoDB 会记录修改前的数据副本(即 Undo Log)。如果事务失败或显式调用回滚(ROLLBACK),InnoDB 会根据 Undo Log 将数据恢复到事务开始前的状态。
  • 事务日志:InnoDB 通过日志记录每个操作。无论是成功还是失败,系统都会根据这些日志恢复数据。

实现:

  • 如果事务执行过程中发生故障,所有未提交的操作都可以通过回滚机制(Undo Log)撤销,确保数据库状态的一致性。

2. 一致性(Consistency)

一致性保证事务开始前和结束后,数据库的状态都必须是一致的。每个事务都必须使数据库从一个一致性状态转换到另一个一致性状态。事务的执行不会破坏数据完整性约束(如外键约束、唯一性约束等)。

原理:

  • 约束检查:数据库的完整性约束(如主键、外键、唯一性等)保证在事务执行过程中,数据始终符合预定义的规则。
  • 触发器(Triggers)和存储过程:可以确保复杂的约束和逻辑的执行。它们会在事务提交时验证数据库的一致性。
  • 事务日志和恢复:MySQL 使用 Redo LogUndo Log 来保证一致性,即使在系统崩溃的情况下,日志也可以帮助恢复数据到一致性状态。

实现:

  • 在事务提交之前,所有操作都必须满足数据库的完整性约束。如果事务的任何操作破坏了约束(如插入一个违反外键约束的记录),事务将被回滚,从而保证数据库的一致性。

3. 隔离性(Isolation)

隔离性保证了事务在执行时是独立的,不会受到其他事务的干扰。不同事务之间的操作必须是隔离的,事务的中间状态对其他事务不可见。

原理:

  • 事务隔离级别:MySQL 通过不同的事务隔离级别(Read UncommittedRead CommittedRepeatable ReadSerializable)来控制不同事务之间的隔离性。每个事务隔离级别定义了事务在执行期间可以看到其他事务的哪些数据。

    • Read Uncommitted:允许事务读取其他事务未提交的数据,可能导致脏读。
    • Read Committed:事务只能读取已提交的数据,避免了脏读,但可能出现不可重复读。
    • Repeatable Read:保证在事务期间,某一查询结果是固定的,避免了不可重复读,但仍可能会有幻读。
    • Serializable:最强的隔离级别,确保事务完全隔离,避免了脏读、不可重复读和幻读,但性能较低。
  • 锁机制:InnoDB 使用 行级锁表级锁意向锁 等机制来实现事务之间的隔离,保证事务不会发生冲突,能够按顺序执行。

实现:

  • 通过 控制事务对数据的访问,MySQL 使用 行级锁 来提高并发性,同时通过事务的隔离级别来控制事务间的数据可见性。不同的隔离级别会影响锁的使用和事务的并发性能。

4. 持久性(Durability)

持久性确保一旦事务提交,它对数据库的所有更改都是永久性的,即使系统发生崩溃或断电,这些更改也不会丢失。事务一旦提交,数据就会被持久化到磁盘中。

原理:

  • Redo Log:Redo Log 是 MySQL 中实现持久性的关键。每个事务的提交操作会记录到 Redo Log 中,Redo Log 是一个顺序写入的日志,确保事务的持久性。当事务提交时,Redo Log 会被写入磁盘,保证事务的更改能够在崩溃恢复时重新应用。
  • Doublewrite Buffer:InnoDB 使用 Doublewrite Buffer 来进一步提高数据安全性。每次将数据页写入磁盘之前,它会先写入 Doublewrite Buffer,这样可以避免磁盘出现部分写入的情况,保证数据的一致性。
  • 日志刷盘策略:InnoDB 提供了多个 innodb_flush_log_at_trx_commit 配置选项,控制日志写入磁盘的方式。默认设置为 1,即每次事务提交都会立即将 Redo Log 刷新到磁盘,保证持久性。

实现:

  • 一旦事务提交,数据会被写入磁盘(通过 Redo Log),并保证不会丢失。即使数据库崩溃,系统在恢复时会使用 Redo Log 来重做(redo)已提交事务的操作,从而保证数据的持久性。

MySQL 中如何实现 ACID

  • 原子性:通过 Undo Log 支持回滚操作,每个事务都记录修改前的状态,保证操作的原子性。
  • 一致性:通过数据库的完整性约束和事务日志(Undo Log 和 Redo Log)保证数据库的一致性,防止数据出现不一致的状态。
  • 隔离性:通过 事务隔离级别行级锁 等机制控制并发事务之间的相互影响,确保事务的隔离性。
  • 持久性:通过 Redo LogDoublewrite Buffer 和日志刷盘策略来保证一旦事务提交,对数据库的更改是持久性的,并且能够在系统崩溃后恢复。

总结

MySQL 通过事务日志(Undo Log 和 Redo Log)、锁机制、隔离级别和数据完整性约束等技术实现了 ACID 特性,从而保证了数据库操作的可靠性、一致性和稳定性。每个事务都有明确的生命周期管理,并且在事务处理过程中,MySQL 会确保数据的一致性、隔离性和持久性。

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

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

相关文章

wx206基于ssm+vue+uniapp的优购电商小程序

开发语言:Java框架:ssmuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:M…

React编程高级主题:错误处理(Error Handling)

文章目录 **5.2 错误处理(Error Handling)概述****5.2.1 onErrorReturn / onErrorResume(错误回退)****1. onErrorReturn:提供默认值****2. onErrorResume:切换备用数据流** **5.2.2 retry / retryWhen&…

ubuntu20.04升级成ubuntu22.04

命令行 sudo do-release-upgrade 我是按提示输入y确认操作,也可以遇到配置文件冲突时建议选择N保留当前配置

SpringCloud(25)——Stream介绍

1.场景描述 当我们的分布式系统建设到一定程度了,或者服务间是通过异步请求来通讯的,那么我们避免不了使用MQ来解决问题。 假如公司内部进行了业务合并或者整合,需要服务A和服务B通过MQ的方式进行消息传递,而服务A用的是RabbitMQ&…

centos8上实现lvs集群负载均衡dr模式

1.前言 个人备忘笔记,欢迎探讨。 centos8上实现lvs集群负载均衡nat模式 centos8上实现lvs集群负载均衡dr模式 之前写过一篇lvs-nat模式。实验起来相对顺利。dr模式最大特点是响应报文不经调度器,而是直接返回客户机。 dr模式分同网段和不同网段。同…

uniapp如何接入星火大模型

写在前面:最近的ai是真的火啊,琢磨了一下,弄个uniappx的版本开发个东西玩一下,想了想不知道放啥内容,突然觉得deepseek可以接入,好家伙,一对接以后发现这是个付费的玩意,我穷&#x…

MySQL vs MSSQL 对比

在企业数据库管理系统中,MySQL 和 Microsoft SQL Server(MSSQL)是最受欢迎的两大选择。MySQL 是一款开源的关系型数据库管理系统(RDBMS),由 MySQL AB 开发,现归属于 Oracle 公司。而 MSSQL 是微…

python基础-10-组织文件

文章目录 【README】【10】组织文件(复制移动删除重命名)【10.1】shutil模块(shell工具)【10.1.1】复制文件和文件夹【10.1.1.1】复制文件夹及其下文件-shutil.copytree 【10.1.2】文件和文件夹的移动与重命名【10.1.3】永久删除文件和文件夹【10.1.4】用…

ORA-09925 No space left on device 问题处理全过程记录

本篇文章关键字:linux、oracle、审计、ORA-09925 一、故障现像 朋友找到我说是他们备份软件上报错。 问题比较明显,ORA-09925,看起来就是空间不足导致的 二、问题分析过程 这里说一下逐步的分析思路,有个意外提前说一下就是我…

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测

多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-GRU贝叶斯优化门控循环单元多输入多输出预测&#…

27信号和槽_自定义信号(2)

自定义信号和槽 绑定信号和槽 如何才能触发出自定义的信号呢?(上诉代码只是将信号和槽绑定在一起,但并没有触发信号) Qt 内置的信号,都不需要咱们手动通过代码来触发 用户在 GUI, 进行某些操作,就会自动触发对应信号.(发射信号的代码已经内置…

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开!

人工智能在生物医药领域的应用地图:AIBC2025将于6月在上海召开! 近年来,人工智能在生物医药行业中的应用受到广泛关注。 2024年10月,2024诺贝尔化学奖被授予“计算蛋白质设计和蛋白质结构预测”,这为行业从业人员带来…

2025.3.19

1、用vim编辑/etc/hosts文件,将本机和第二个虚拟机的ip地址和主机名写入该文件,然后ping 两个主机的主机名能否ping通; (1)在第一个虚拟机编辑/etc/hosts: 首先使用hostname、hostnamectl、hostname -f指令查看主机名…

深度学习 Deep Learning 第16章 结构化概率模型

深度学习 Deep Learning 第16章 结构化概率模型 内容概要 本章深入探讨了结构化概率模型(Graphical Models,包含有向图和无向图模型)的概念及其在深度学习中的应用。结构化概率模型通过图结构描述随机变量之间的直接交互,从而简…

鸿蒙 harmonyOS 网络请求

应用通过HTTP发起一个数据请求,支持常见的GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT方法。 接口说明 HTTP数据请求功能主要由http模块提供。 使用该功能需要申请ohos.permission.INTERNET权限。 第一步 : 在module.json5文件里面添加网络…

进程概念(Linux)

目录 一. 冯诺依曼体系结构 二. 操作系统(OS(操作系统的英文缩写Operator System)) 2.1概念 2-2 设计OS的目的 2.3 核心功能 2.4 如何管理(先描述再组织) 2.5 系统调用和库函数概念 三.进程 3.1 基本概念与基本操作 3.2 描述进程-PCB 3.3 如何…

免费在线MBTI性格测试工具 - 探索你的性格特质

免费在线MBTI性格测试工具 - 探索你的性格特质 简介 我很高兴为大家分享这个专业的MBTI性格测试工具。这是一个完全免费的在线测试系统,基于迈尔斯-布里格斯类型指标(MBTI)理论开发,旨在帮助您更好地了解自己的性格特征,发现职业发展方向。…

AI 数理逻辑基础之统计学基本原理(上)

目录 文章目录 目录统计学统计学基本概念描述性统计数据可视化图表工具 汇总统计统计数据的分布情况:中位数、众数、平均值统计数据的离散程度:极差、方差、标准差、离散系数 相关分析Pearson 线性关系相关系数Spearman 单调关系相关系数 回归分析回归模…

积分赛——读取实时时间

设计要求 调用DS1302芯片驱动程序,读取DS1302中的实时时分秒数据,并显示在数码管上。 23时59分59秒 通过串口发送时间作为定时时间,定时时间到则蜂鸣器响2s后静音。 串口发送格式:“12:35:66”。 备注&…

进程和线程的概念及Linux操作

文章目录 一、进程与线程1、进程2、线程3、查看进程与线程 二、Linux的“虚拟内存管理”,它与stm32中的 真实物理内存(内存映射)有什么区别?三、Linux系统调用函数 fork()、wait()、exec() 等1、fork()函数…