mysql InnoDB 事务的实现原理

news2025/1/21 4:56:43

前言

        关于mysql的InnoDB存储引擎的关键知识点,已经输出了6篇文章了,但是好像阅读量并不大,可能大家都不太喜欢理论性特别强的东西?或者是这些知识点难度有点高,不太容易被接受?不过,我觉得我分享这些东西都是mysql的核心知识,相当重要,难道是有难度?当然,我已经尽可通用较为通俗的表述来分享它。写作功能有限,如果你有好的建议,就在评论区告诉我吧。

1. 什么是事务

        事务可以把数据库从一种一致性的状态转换为另一种一致状态。通俗一点,一个数据库操作任务,包含多个子任务,子任务里有查询,有修改,有删除,那么这个操作任务在执行过程中,所有的子任务要么一起成功,要么一起失败并回滚到操作任务开始前的状态。

2. 事务的特性

        事务有ACID四个特性,分别是:

        原子性(Atomicity):事务原子性的关键在于不可分割,即一个事务任务的所有子任务要么一起成功要么一起回滚。

        一致性(Consistency):事务一致性重点是指事务操作前后的状态变化,即前后的状态必须是一致,具体的表现就是同一事务任务内的所有子任务要么一起成功要么一起失败回滚。

        隔离性(Isolation):事务隔离性的关注点是在多个事务之间的相互影响,即多个事务任务之间是互斥和隔离的,彼此之间不能相互影响。

        持久性(Durability):事务持久性的关注点在于事务操作的结果,即事务操作成功后,结果是永久性的,不存在说停电了服务再重启后结果又变了。

        事务的四大特性,实际是从不同的角度对于事务定了一些标准,InnoDB引擎的事务也符合这些特性的,但实际是有的数据库的事务有可能只符合了其中几个特性。

3. 事务的隔离级别

        SQL标准化组织定义了四种事务隔离级别,InnoDB默认的事务隔离级别是可重复读。

        read uncommitted 读未提交

        read committted 读已提交

        repeatable read 可重复读

        serializable 序列化

        事务有四大特性,就是原子性、一致性、隔离性、持久性,其中的隔离性是通过锁来实现,而原子性、一致性、持久性是通过数据库的redo log 和undo log实现的。那么redo log和undo log实现的,这两个是什么玩意?下面分别具体说一下。

4. redo log

        redo log叫做重做日志,用来保证事务的原子性和持久性的重要机制,当mysql服务器意外崩溃或宕机时,可以保证已提交的事务持久化到磁盘。那么redo log是怎么保证事务提交后发生意外时数据会持久化到磁盘中呢?

        对于mysql的InnoDB存储引擎,在开启事务后,执行一个事务操作,如增、删、改时,不会直接去磁盘上找到要操作的数据,然后直接修改,而是会先查看一下缓存池(buffer pool),看看要操作的数据是否在缓冲池中,如果不在缓存池中,则直接从磁盘上把包含要操作数据行所在页加载到缓存池中,再对缓存池中的数据进行修改,接着会把操作后的数据写入到重做日志缓冲池中(redo log buffer),事务提交时,重做日志缓冲池中操作后的数据会写入到重做日志文件中。

        等等,是不是哪里不对,事务操作(增、删、改)数据只对缓存中的数据进行修改,不写入磁盘吗?这里要注意的是,mysql InnoDB的设计不是直接把事务操作后的数据直接写入到磁盘中,《mysql InnooDb存储引擎的体系结构和逻辑存储结构》中已说过页是InnoDB存储引擎磁盘管理的最小单位,如果立刻要写入磁盘的话,尽管事务操作了个别行的数据,那也需要更新整个数据页,这样就过于浪费数据库性能了。那为什么又写入重做日志了,难道这就不浪费数据库性能了?

        当然不会,因为从重做日志缓冲中写入到重做日志文件中的数据,只是一条日志,日志的内容就是操作是哪个页的数据,第几行(偏移量),操作后的数据是什么样,而不是整个数据页,权衡一下,更新一个页和更新一行数据,当然一行所消耗的代价更小。这么说好像也能理解了,那么事务操作数据后,不写入磁盘,难道不怕数据丢了吗?这个不用担心,事务提交时,不是写入重做日志了嘛,如果真发生故障了,可以根据故障时间和重做日志进行数据恢复,由于redo log是顺序写入的,再顺序读出恢复也很快的。正常情况下,缓存池中事务操作后的数据会有另外一套机制从缓存池刷新到磁盘上的。

        这里还要再多说一点,从重做日志缓存池写入到重做日志文件文件还有点套路,有一个参数innodb_flush_log_at_trx_commit控制写入日志文件的策略,默认值为1,表示事务提交成功时,肯定会先从重做日志缓存池写入操作系统缓存,再通过fsync操作从系统缓存写入磁盘。另外两个值是0和2,0表示每隔1秒才会执行fsync操作,如果故障就发生在这一秒内,那数据就丢一部分;2表示仅写入到系统缓存,不会执行fsync操作,这种情况就要祈祷发生的故障是数据库服务,而不是操作系统,否则也会丢失未从系统缓存中刷新到重做日志的那部分数据。

        是不是感觉这里面套路很多,其实这些还好,仔细梳理一下,还能理解清楚,mysql的优化器设计才是真复杂呢。

5.undo log

        undo log的作用就是用于事务操作失败时回滚数据,保证事务的一致性的。举个例子,如果InnoDB执行了一个insert操作,那么undo log会记录一条delete操作,如果是InnoDB执行了一个delete操作,那么undo log会记录一条insert操作;如果InnoDB执行了一个update操作,那么undo log会记录一条相反的update操作,将修改前的数据改回去。另外一个作用就MVCC(多版本并发控制),即当用户读取一行数据的时候,若该行记录被其他事务锁定,就会通过undo log读取之前版本的数据,实现非锁定读取。

6.总结

  1. redo log记录的是物理日志,是修改后的物理数据和一些其他信息,平时不会去读取,遇到意外故障时可以保证数据的持久化。
  2. undo log也可以理解为一种重做日志,不过和redo log不一样,undo log记录的是逻辑日志,即用于数据修改的物理操作语句(sql)。
  3. undo log会产生redo log,因为回滚操作时,也可能会发生停电之类的意外,也需要持久性的安全保护。

 

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

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

相关文章

【Java实战】工作中并发处理规范

目录 一、前言 二、并发处理规范 1.【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 2.【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。 3.【强制】线程资源必须通过线程池提供,不允许在应用中…

数仓数据同步策略

学习内容一、同步策略一、同步策略 数据同步策略的类型包括:全量同步、增量同步、新增及变化同步、特殊情况 全量表:存储完整的数据增量表:存储新增加的数据新增及变化表:存储新增加的数据和变化的数据特殊表:只需要…

定义自定义指令;inserted()、update()

自定义指令的意义:对普通DOM元素进行底层操作; 作用 :可以获取到底层的dom,拿到想要的节点,从而进行操作; 实际应用:可以通过指令知道什么时候dom创建完成,从而进行依赖dom的库的初…

刷爆力扣之有效的山脉数组

刷爆力扣之有效的山脉数组 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题&#x…

超级浏览器的Cookies实现跨境电商防关联

大家有没有过这种感觉,打开电脑或手机,一些你喜欢的视频,总能一下子打到心巴上;心心念念想要下单的东西,总是不停出现在屏幕上诱惑你下单。你以为网络才是最懂你的人,其实是大数据正在研究你的一举一动。而聊到大数据&…

Cerebral Cortex:疼痛热刺激引起的脑功能网络分离与整合

目前的研究旨在确定热痛期间大脑网络整合/分离的变化,使用高时间分辨率的网络连接事件优化方法。参与者(n 33)主动判断施加于前臂掌侧的热刺激是否疼痛,然后在每次试验后评价温暖/疼痛强度。我们表明,试验中整合/分离的时间演化与疼痛的主观…

Ubuntu中安装Qt

文章目录Ubuntu中安装必要的软件安装流程配置运行配置运行Ubuntu中安装必要的软件 主要为了打开图形程序 sudo apt-get update sudo apt-get --assume-yes upgrade sudo apt-get install --assume-yes xfce4 xorg-dev libopencc2 libopencc2-data unzip zip主要是一些共享lib…

ECU简介

ECU是电子控制单元的简称,广泛用于汽车系统中,是电控系统的神经中枢。本文将以比较基础的方式展开ECU的工作原理。 一、基本结构 ECU主要由CPU、存储器、IO接口、信息传递总线组成。ECU可以把传感器传入的信号用内存程序和数据启动相应的程序&#xff0c…

人工智能:语音识别技术介绍

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&…

移动Web

her~~llo,我是你们的好朋友Lyle,是名梦想成为计算机大佬的男人! 博客是为了记录自我的学习历程,加强记忆方便复习,如有不足之处还望多多包涵!非常欢迎大家的批评指正。 目录 一、字体图标 1.1 使用字体图…

Windows使用scp上传文件到linux服务器

我不是管理员,所以上传有点麻烦,需要在windows电脑上操作scp命令, 命令格式:上传文件夹带上-r,上传文件就不用带-r了,而且只能上传到tmp目录下,然后再使用mv命令移动到你想要的目录下&#xff…

宝塔上的wordpress站点更换域名+配置SSL+改版百度收录

前言 好久没写文章了,甚是想念,近半年来发生了很多事情,心态也变了很多。 这个博客自创办以来,原域名叫“is-hash.com”,是我2019年的突发奇想注册此域名,“is-hash”即为“是#”(hash是#的英…

力扣第73题

一、题目:73. 矩阵置零 二、题目解析: 解题步骤:注意题目要求原地算法–>利用矩阵的第一行和第一列记录矩阵需要置0的行和列,只要把0所在行和列的第一个位置置为0, 然后再根据第一行和第一列0的位置,对…

设备树覆盖:实现 DTO

前面我们学习了dts,也知道这个dtc、dtb。这个dto是什么? 实现 DTO 包括分割设备树、构建、分区和运行。 在实现可以正常工作之后,您还必须保持两个 DT 之间的兼容性,并确定用于确保每个 DT 分区安全性的策略。 1、分割 DT 首先…

Linux-用户概念和用户管理命令,用户组概念和用户组管理命令。

一,用户概念和用户管理命令: 1,linux是一个多用户操作系统,多个用户可以在同一时间内登录同一系统。 用户可理解为获取系统资源权限的集合,每个用户都会分配一个uid。分为三种: 超级用户:uid为…

String的方法介绍以及实现

今天需要掌握的有如下方法,有点多,但是不难,加油吧 1.字符串的查找 2.字符串的转化 3.字符串的截取 4.字符串的替换 5.字符串的拆分 6.字符串的其他方法 1.字符串的查找 public class TestDemo {public static void main(String[] ar…

java进阶—集合

前面我们知道了一个能存东西的数据结构,数组 java 基础——数组,现在我们来看一个高级一点的东西,集合 这里先提一点,集合的底层其实是数组 集合(collection)是什么呢? 我们可以把集合想象成…

接口测试需求分析

测试接口的时候,可能很多人都会想,按着研发给的接口协议文档来测,不就好了吗? 其实,对于接口的测试,还需要有点深度的需求分析,然后再进行对应的测试。对于接口测试,这里有个不太详…

python 高级技巧

闭包 定义双层嵌套函数,内层函数可以访问外层函数的变量 将内层函数作为外层函数的返回,此层函数就是闭包函数 在函数嵌套的前提下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变…

12小时,教室与生产线接力 复旦MBA科创青干营首个整合实践活动日

针对有志于投身科创事业的复旦MBA学生,复旦管院特别开设“复旦MBA科创青干营”,将科创管理教育与MBA培养体系深度融合。在MBA核心课基础上,学院为学生定制了原创、系统和注重实战的科创课程,并通过科创企业参访、科创先锋论坛、科…