InnoDB 一条更新语句的执行过程

news/2024/11/16 21:23:29/

连接器,解析器,优化器,执行器,这里就不细说了。
1.检查要更新的数据页是否在 Buffer pool 中,如果不存在从磁盘上读取数据页,放到 Buffer Pool 中;
如果存在,则直接修改对应的数据页。
2.在修改数据之前,要先生成对应的 redo log,把 redo log 写入 redo log buffer 中。
3.当用户commit的时候,需要把redo log buffer 中的数据写入到磁盘 redo log 文件中。
而Buffer Pool中的脏页,并不是立刻刷回磁盘的,有很多的刷盘策略
4.如果redo log 写入成功,代表commit成功。
5.如果redo log 写入失败,需要rollback回滚操作。
话术:
首先由server层的连接器建立连接,通过解析器解析sql语句,通过优化器进行sql优化,在使用执行器把sql语句交给引擎层去执行,在InnoDB引擎中,会开启事务,然后加插入意向锁【这里感觉有问题】锁定主键保证并发插入,接着记录undo log的redo log缓冲区,然后记录undo log缓冲区,再去记录redo log缓冲区,(这里undo log是保证事务回滚的关键,redo log是保证数据不丢失的关键),更新数据内存页缓冲区,然后进行提交事务,此时redo log会进行落盘,redo log落盘成功则事务提交成功,否则事务回滚,释放插入意向锁,执行结束。这里有个关键点就是所有日志和数据在事务提交前都保存在了缓冲区中,只有事务提交并且redo log落盘成功时,才算真正的执行成功。


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

相关文章

UML类图与设计模式/原则

目录 类之间的关系依赖泛化(继承)实现关联聚合组合 设计模式的七大原则设计模式单例工厂模式原型模式(深/浅拷贝)建造者模式适配器模式桥接模式装饰者模式组合模式外观模式享元模式代理模式模板方法模式命令模式访问者模式迭代器模式观察者模式中介者模式…

分布式锁解决方案_基于Redisson实现的分布式锁实现

Redisson介绍: https://github.com/redisson/redisson/wiki Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象,Redisson、Jedis、Lettuce是三个不同的操作 Redis 的客户端,Jedis、…

Todoist 的 10 种最佳替代品(功能、优点、缺点、定价)

寻找最好的 Todoist 替代品? Todoist对项目管理者来说并不陌生,它自 2007 年以来就一直很出名! ……但是作为老牌的组织类应用程序之一,现在再用它是否会觉得有点不顺手? 虽然它为了更好适应当今的工作节奏&#xf…

数据库设计三大范式

数据库设计三大范式 范式就是数据库表设计的依据,教你怎么进行数据库表的设计的。 ● 第一范式:要求任何一张表都必须要有主键,每一个字段原子性不可再分。 ● 第二范式:建立在第一范式的基础之上,要求所有非主键字段完…

在服务器上重新运行flask项目

我昨天运行我的flask项目,因为依赖冲突而重新生成了requirements.txt,现在我需要重新创建虚拟环境吗? 删除了一个依赖:flask_jwt 是的,建议您在生成新的 requirements.txt 文件后重新创建虚拟环境。这样可以确保您的…

2023年NOC大赛创客智慧编程赛项Python 复赛模拟题(二)

题目来自:NOC 大赛创客智慧编程赛项Python 复赛模拟题(二) NOC大赛创客智慧编程赛项Python 复赛模拟题(二) 第一题: 编写一个成绩评价系统,当输入语文、数学和英语三门课程成绩时,输出三门课程总成绩及其等级。 (1)程序提示用户输入三个数字,数字分别表示语文、数学、…

能否在Ubuntu上创造一个虚拟的Ubuntu环境?

可以的。在 Ubuntu 上创建虚拟的 Ubuntu 环境的方式有很多种,常用的有使用 Docker 和虚拟机(如 VirtualBox,VMware)等。 方法 使用 Docker: Docker 是一种容器技术,它能够让你在隔离的环境中运行应用程序。Docker 可…

Linux Audio (7) DAPM-4 Path/Route添加过程

DAPM-4 Path/Route添加过程 route分类:route转化为Pathcodec驱动add widgetMechine驱动add kcontrol route分类: 常规route {“sink”, NULL, “source”},其path->connect1 sink widget是Mixer {“Mixer”, name1, “source1”} {“Mixe…