一文带你了解MySQL事务特性以及其底层原理

MySQL的事务支持是通过其存储引擎,特别是InnoDB存储引擎来提供的。事务的四大特性,通常被称为ACID属性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。这些特性确保了数据库事务的可靠执行。下面我们详细探讨每个特性及其底层实现原理。

1. 原子性(Atomicity)

原子性确保了事务中的操作要么全部成功,要么全部失败,没有中间状态。如果事务中的任何操作失败,则整个事务将回滚到事务开始之前的状态。

底层实现原理:
  • Undo日志:InnoDB利用Undo日志来实现原子性。当事务进行修改操作时,InnoDB会记录修改前的数据到Undo日志中。如果事务失败或需要回滚,InnoDB可以利用Undo日志恢复数据到事务开始前的状态。

2. 一致性(Consistency)

一致性确保事务将数据库从一个一致的状态转换到另一个一致的状态。事务执行过程中不会破坏数据库的完整性和业务规则。

底层实现原理:
  • 约束检查:InnoDB在执行事务时会进行必要的约束检查,包括外键约束、唯一性约束等,以确保数据的一致性。
  • ACID特性的结合:原子性、隔离性和持久性的结合也确保了一致性。比如,通过原子性保证操作的完整性,通过隔离性保护事务间的影响,通过持久性确保数据的稳定存储。

3. 隔离性(Isolation)

MySQL支持四种事务隔离级别,它们分别是:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别提供了不同程度的数据隔离,以平衡事务之间的隔离性和系统的并发性。MySQL的默认隔离级别是可重复读(Repeatable Read)。

3.1. 读未提交(Read Uncommitted)
  • 定义:事务中的更改,即使没有提交,对其他事务也是可见的。
  • 问题:可能导致“脏读”,即一个事务可能读到另一个事务未提交的数据。
底层实现原理:

在这个级别下,没有特别的机制来保证隔离性,事务不会因为读操作而在读取的数据上设置任何锁,这使得数据在被提交之前就对其他事务可见。

.3.2. 读已提交(Read Committed)

  • 定义:一个事务只能看到已经提交的事务所做的更改。
  • 问题:可能导致“不可重复读”,即在同一事务中,两次执行相同的查询可能会得到不同的结果。
底层实现原理:

通过“即时版本号”(Instant Versioning)机制,每次查询只能看到查询开始时刻之前已经提交的更改。当一个事务进行更新操作时,它会创建数据的新版本,并附上一个事务版本号。在读已提交级别下,读操作会忽略比事务版本号更高的数据版本,从而只能看到已提交的数据。

3.3. 可重复读(Repeatable Read)

  • 定义:在同一事务中,多次读取同一数据结果是一致的。
  • 问题:可能导致“幻读”,即当一个事务读取某个范围的记录时,另一个事务在该范围内插入新的记录,那么在第一个事务中,新的记录会被看到。
底层实现原理:

通过多版本并发控制(MVCC)实现。每行数据都有一个创建版本号和删除版本号(事务版本号),当事务访问一行数据时,只有当该行的创建版本号小于等于事务的版本号,并且该行的删除版本号未定义或大于事务的版本号时,事务才能看到该行数据。此外,InnoDB在可重复读隔离级别下使用Next-Key锁来避免幻读,锁定索引记录和前面的间隙。

3.4. 串行化(Serializable)

  • 定义:最严格的隔离级别,事务只能顺序执行。
  • 实现:通过在读取的每一行数据上加锁来实现。
底层实现原理:

在串行化级别下,InnoDB会对所有的读操作加锁,防止其他事务的并发访问,这确保了事务可以完全串行执行。这是通过在读取的每一行数据上设置共享锁实现的,如果事务尝试修改数据,则会使用排他锁。

4. 持久性(Durability)

持久性保证了一旦事务提交,其所做的修改将永久保存在数据库中,即使发生系统崩溃也不会丢失数据。

底层实现原理:
  • Redo日志:InnoDB通过Redo日志实现持久性。当事务提交时,事务的修改操作会先被写入到Redo日志中。即使数据库发生崩溃,这些操作也可以在重启后通过Redo日志进行重放,恢复事务提交时的状态。
  • 写前日志(Write-Ahead Logging, WAL):InnoDB在修改页内容前,会先将修改的内容写入到Redo日志,确保即使发生崩溃,所有提交的事务修改也能通过Redo日志恢复。

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

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

相关文章

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题,原本打算在代码中自己写一个类去管理将打印信息收集到log日志中,忽然想到,其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test,并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…

使用 mypy 做 type check

前言 完残!😂,最近看之前写的 Python 代码老得琢磨这比变量的类型是啥(Python 无类型系统xxx),不愧是我写的! 看段之前写的实现迭代器模式的代码: # 抽象迭代器类 class Iterator(…

7-7 12-24小时制

题目链接&#xff1a;7-7 12-24小时制 一. 题目 1. 题目 2. 输入输出格式 3. 输入输出样例 4. 限制 二、代码 1. 代码实现 #include <stdio.h>int main(void) {int hour, minute;char *str;if (scanf("%d:%d", &hour, &minute) ! 2) {return -1;}i…

操作系统系列学习——死锁处理

文章目录 前言死锁处理 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划学习操作系统并完成6.0S81&#xff0c;加油&#xff01; 本文总结自B站【哈工大】操作系统 李治军&#xff08;全32讲&#xff09; 老师课程讲的非常好&#xff0c;感谢 【哈工大】操…

如何优惠申请DigiCert证书

DigiCert作为全球知名的数字证书颁发机构&#xff0c;其SSL证书以高度的安全性和信任度广受认可。而JoySSL作为国内优秀的SSL证书服务平台&#xff0c;提供了便捷、高效的证书申请服务&#xff0c;让您能够轻松获取并安装DigiCert SSL证书。接下来&#xff0c;本文将详细介绍如…

pytest相关面试题

pytest是什么&#xff1f;它有什么优点&#xff1f; pytest是一个非常流行的Python测试框架&#xff0c;它具有简洁、易用、高校等优点。他可以帮助测试人员方便地编写和运行测试用例&#xff0c;并且提供了丰富的插件和扩展&#xff0c;支持各种测试需求介绍下pytest常用的库 …

什么情况用@RequestBody、@RequestParm、@PathVariable

1.requestParam(请求参数&#xff09;&#xff1a;使用RequestParam注释将请求参数绑定到控制器中的方法参数。用于从请求访问查询参数值的RequestParam注释。 如下请求URL&#xff1a;http://localhost:8080/springmvc/hello/101?param110&param220 以下是RequestParam注…

腾讯云服务器怎么买省钱?先领券,再下单!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

网工内推 | 七险一金,上市公司招信息安全工程师,大牛带队

01 启明星辰信息技术集团股份有限公司 招聘岗位&#xff1a;数据安全服务工程师 职责描述&#xff1a; 1、负责数据安全服务项目的管理&#xff0c;统筹组织并协调资源落实项目交付实施; 3、负责数据安全风险评估、数据分类分级、数据安全管理制度、数据安全体系规划等数据安…

企事业单位宣传,三下乡的稿子怎么在学习强国网投稿发稿,价格多少钱?

随着学习强国成为各个企事业单位宣传的重要平台&#xff0c;如何在学习强国上发稿&#xff0c;尤其是三下乡的宣传稿件&#xff0c;成为了各位传媒工作者关注的焦点。在这里&#xff0c;我们要向大家介绍一下媒介多多网发稿平台&#xff0c;为大家提供一个便捷高效的投稿发稿渠…

C#实现俄罗斯方块代码

创建一个基本的俄罗斯方块游戏需要实现以下功能&#xff1a; 游戏区域的绘制&#xff1a;这是放置游戏方块的地方。方块的形状和旋转&#xff1a;俄罗斯方块有7种基本形状&#xff0c;每种形状都可以旋转。方块的移动&#xff1a;方块需要能够左移、右移以及下落。方块的固定&…

STM32相关资料汇总

STM32选型表 STM32手册参考网站 https://www.stmcu.org.cn/

命名空间——初识c++

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 经典的Hello Word 起航c关键字c语言的命名冲突问题域作用限定符::命名空间 namespace命名空间定义命名空间的使用1.加命名空间名称及作用域限定符2.使用…

Thingworx高可用集群部署(四)-Pgpool-II安装

主机&#xff1a;10.10.10.71、10.10.10.72、10.10.10.73 VIP: 10.10.10.101 用户&#xff1a;postgres 配置互信 passwd postgres 密码 postgres vi /etc/sudoers postgres ALL(ALL) NOPASSWD: ALL su - postgres ssh-keygen ssh-keygen -t rsa -f .ssh/id_…

【CNN轻量化】ParameterNet: Parameters Are All You Need 参数就是你所需要的

论文链接&#xff1a;http://arxiv.org/abs/2306.14525 代码链接&#xff1a;https://github.com/huawei-noah/Efficient-AI-Backbones 一、摘要 现有的低FLOPs模型&#xff08;轻量化模型&#xff09;无法从大规模预训练中受益。本文旨在增加大规模视觉预训练模型中的参数数量…

跟着cherno手搓游戏引擎【29】Batch简单合批

思路&#xff1a; CPU和GPU都开辟同样大小的一大块内存&#xff08;为了存储顶点信息&#xff09; 索引在程序运行时生成对应规则后绑定到索引缓冲中 动态生成顶点信息&#xff08;现在改成Drawquad只是确定图形顶点的位置&#xff09; 然后在Endscene&#xff0c;将CPU的动…

蓝桥杯之简单数论冲刺

文章目录 取模快速幂 取模 这道题目有两个注意点&#xff1a; 1.当你的取模之后刚好等于0的话&#xff0c;后面就不用进行后面的计算 2.if sum detail[i] > q: 这个语句的等号也很重要 import os import sys# 请在此输入您的代码a,b,n map(int,input().split())week a*5 …

从政府工作报告探计算机行业发展

政府工作报告作为政府工作的全面总结和未来规划&#xff0c;不仅反映了国家整体的发展态势&#xff0c;也为各行各业提供了发展的指引和参考。随着信息技术的快速发展&#xff0c;计算机行业已经成为推动经济社会发展的重要引擎之一。因此&#xff0c;从政府工作报告中探寻计算…

docker常用命令大全

服务相关命令​ 启动 docker 服务​ systemctl start docker 停止 docker 服务​ systemctl stop docker 重启 docker 服务​ systemctl restart docker 查看 docker 服务状态​ systemctl status docker 设置开机启动 docker 服务​ systemctl enable docker 镜像相…

初始Java篇(JavaSE基础语法)(2)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 目录 逻辑控制 顺序结构 分支结构 if语句 switch 语句 循环结构 while 循环 for 循环 do while 循环 输入输出 输出到控制台 从键盘输入 …