MySQL-redo log和undo log

news/2024/11/24 11:50:23/

什么是事务

事务是由数据库中一系列的访问和更新组成的逻辑执行单元

事务的逻辑单元中可以是一条SQL语句,也可以是一段SQL逻辑,这段逻辑要么全部执行成功,要么全部执行失败

举个最常见的例子,你早上出去买早餐,支付宝扫码付款给早餐老板,这就是一个简单的转账过程,会包含两步

从你的支付宝账户扣款10元
早餐老板的账户增加10元

这两步其中任何一部出现问题,都会导致整个账务出现问题

假如你的支付宝账户扣款10元失败,早餐老板的账户增加成功,那你就Happy了,相当于马云请你吃早餐了,O(∩_∩)O哈哈~

假如你的支付宝账户扣款10元成功,早餐老板的账户增加失败,那你就悲剧了,早餐老板不会放过你,会让你重新付款,相当于你请马云吃早餐了-_-?

事务就是用来保证一系列操作的原子性,上述两步操作,要么全部执行成功,要么全部执行失败

数据库为了保证事务的原子性和持久性,引入了redo log和undo log

redo log

redo log是重做日志,通常是物理日志,记录的是物理数据页的修改,它用来恢复提交后的物理数据页
在这里插入图片描述

如上图所示,redo log分为两部分:

内存中的redo log Buffer是日志缓冲区,这部分数据是容易丢失的
磁盘上的redo log file是日志文件,这部分数据已经持久化到磁盘,不容易丢失

SQL操作数据库之前,会先记录重做日志,为了保证效率会先写到日志缓冲区中(redo log Buffer),再通过缓冲区写到磁盘文件中进行持久化,既然有缓冲区说明数据不是实时写到redo log file中的,那么假如redo log写到缓冲区后,此时服务器断电了,那redo log岂不是会丢失?

在MySQL中可以自已控制log buffer刷新到log file中的频率,通过innodb_flush_log_at_trx_commit参数可以设置事务提交时log buffer如何保存到log file中,innodb_flush_log_at_trx_commit参数有3个值(0、1、2),表示三种不同的方式

为1表示事务每次提交都会将log buffer写入到os buffer,并调用操作系统的fsync()方法将日志写入log file,这种方式的好处是就算MySQL崩溃也不会丢数据,redo log file保存了所有已提交事务的日志,MySQL重新启动后会通过redo log file进行恢复。但这种方式每次提交事务都会写入磁盘,IO性能较差
为0表示事务提交时不会将log buffer写入到os buffer中,而是每秒写入os buffer然后调用fsync()方法将日志写入log file,这种方式在MySQL系统崩溃时会丢失大约1秒钟的数据
为2表示事务每次提交仅将log buffer写入到os buffer中,然后每秒调用fsync()方法将日志写入log file,这种方式在MySQL崩溃时也会丢失大约1秒钟的数据

undo log

undo log是回滚日志,用来回滚行记录到某个版本,undo log一般是逻辑日志,根据行的数据变化进行记录

undo log跟redo log一样也是在SQL操作数据之前记录的,也就是SQL操作先记录日志,再进行操作数据

在这里插入图片描述

总结一下

MySQL中是如何实现事务提交和回滚的?

为了保证数据的持久性,数据库在执行SQL操作数据之前会先记录redo log和undo log

redo log是重做日志,通常是物理日志,记录的是物理数据页的修改,它用来恢复提交后的物理数据页

undo log是回滚日志,用来回滚行记录到某个版本,undo log一般是逻辑日志,根据行的数据变化进行记录

redo/undo log都是写先写到日志缓冲区,再通过缓冲区写到磁盘日志文件中进行持久化保存

undo日志还有一个用途就是用来控制数据的多版本(MVCC)

简单理解就是:

redo log是用来恢复数据的,用于保障已提交事务的持久性

undo log是用来回滚事务的,用于保障未提交事务的原子性


http://www.ppmy.cn/news/27304.html

相关文章

Julia 数据类型

在编程语言中,都有基本的数学运算和科学计算,它们常用的数据类型为整数和浮点数。 另外还有一个"字面量"的术语,字面量(literal)用于表达源代码中一个固定值的表示法(notation)&…

【蓝桥杯每日一题】差分算法

🍎 博客主页:🌙披星戴月的贾维斯 🍎 欢迎关注:👍点赞🍃收藏🔥留言 🍇系列专栏:🌙 蓝桥杯 🌙我与杀戮之中绽放,亦如黎明的花…

因果推断方法(一)合成控制

知道的跳过下面的简单介绍: 就是比如广告主投放了10w元,那么他的收益怎么算?哪些订单就是广告带来的,哪些是不放广告也会购买? 合成控制法是目前我实际应用发现最好用的。置信度高,且容易理解。 简单讲下思…

当我尝试问了chatGPT几个问题之后,我感到了危机......

问题1 : vue3 框架的bug有哪些? 组件内部的状态更新不及时:由于Vue3使用Proxy来实现响应式,在某些情况下,组件内部的状态更新不及时,导致组件的渲染出现问题。 组件内部的数据更新不及时:由于V…

【概念辨析】二维数组传参的集中可能性

一、二维数组传参竟然不是用二级指针进行接收? 今天进行再一次的二级指针学习时,发现了一条以前没怎么注意过的知识点:二维数组进行传参只能用二维数组(不能省略列)进行接收或者是数组指针。 问题复现代码如下&#xf…

MybatisPlus------插件(分页、乐观锁)通用枚举类(九)

MybatisPlus------插件(分页、乐观锁)(九) MybatisPlus自带分页插件,只要简单的配置就可以实现分页功能。 分页插件 创建分页插件拦截器 // 配置类 Configuration // 扫描mapper接口所在的包 MapperScan("com…

北京/东莞/广州/深圳2023年上半年软考(中/高级)报名>>>

软考是全国计算机技术与软件专业技术资格(水平)考试(简称软考)项目,是由国家人力资源和社会保障部、工业和信息化部共同组织的国家级考试,既属于国家职业资格考试,又是职称资格考试。 系统集成…

持续事务管理过程中的事件驱动

比较官方的定义:事件驱动是指在持续事务管理过程中,进行决策的一种策略,即跟随当前时间点上出现的事件,调动可用资源,执行相关任务,使不断出现的问题得以解决,防止事务堆积。在计算机编程、公共…