MySQL系列:innodb源码分析之mini transaction

2024-08-22 08:58

本文主要是介绍MySQL系列:innodb源码分析之mini transaction,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    日志是innodb一个非常重要的模块,在innodb中有两类日志:redo log和undo log。其中redolog日志是用来做数据异常恢复和数据库重启时页数据同步恢复的,redo log是建立在在mini transaction基础上。数据库在执行事务时,通过minitransaction产生redo log来保证事务的持久性。

1.mini transaction三个协议

        mini-transcation是用来实现innodb的物理逻辑日志的写入和页恢复的,通过mini-transcation来保证并发事务操作和数据库异常是页的一致性。为了得到页的一致性,mini-transaction遵循以下三个协议:

        1. The FIX Rules

      2. Write-Ahead Log

      3. Force-log-at-commit

1.1The FIX Rules

    The FIX Rules规定如下:

              修改一个页需要获得该页的x-latch

              访问一个页是需要获得该页的s-latch或者x-latch

              持有该页的latch直到修改或者访问该页的操作完成

1.2Write-Ahead Log

       Write-Ahead Log的意思就是如果一个页操作在写入到持久设备时,必须内存中相对应的日志写入到持久化设备中。每个页有一个LSN,每次页修改需要维护这个LSN,当一个页需要写入到持久化设备时,要求内存中小于该页LSN的日志先写入到持久化设备中。日志写完后,先Fixed这个页的latch,再将内存中的页刷盘。完成刷盘后,释放页latch。这里遵循The FIX Rules协议。

1.3 Force-log-at-commit

       一个事务可以同时修改了多个页,Write-AheadLog单个数据页的一致性,无法保证事务的持久性。Force -log-at-commit要求当一个事务提交时,其产生所有的mini-transaction日志必须刷到持久设备中。这样即使在页数据刷盘的时候宕机,也可以通过日志进行redo恢复。

2 mini-transaction的日志实现

       innodb是采用mini-transaction来构建操作的物理逻辑日志的,在事务执行的时候,会通过mtr来保证页的数据一致性和持久性。mini-transaction是通过一个mtr_t的结构来实现mini-transaction的三个协议。mtr_t的定义如下:

typedef struct mtr_struct{ulint	 state;                      /*mtr的状态,MTR_ACTIVE、MTR_COMMITING、MTR_COMMITTED*/dyn_array_t	 memo;        /*正在持有的latch列表*/dyn_array_t	 log;             /*mtr产生的日志数据*/ibool	 modifications;     /*是否修改了页*/ulint	 n_log_recs;            /*log操作页的个数*/ulint	 log_mode;             /*log操作模式,MTR_LOG_ALL、MTR_LOG_NONE、MTR_LOG_SHORT_INSERTS*/dulint	 start_lsn;              /*mtr起始的LSN*/dulint  end_lsn;             /*mtr结束的LSN*/ulint  magic_n;             /*魔法字*/}mtr_t;

其中成员memo是个latch持有状态的数组列表,采用的是dyn_array_t的动态内存结构来保存的,每个单元存储的是mtr_memo_slot_t这样的结构。定义如下:
      

typedef struct mtr_memo_slot_struct{ulint	 type;            /*latch的类型值*/void*	 object;        /*latch对象句柄,可以是rw_lock_t或者buf_block_t*/}mtr_memo_slot_t;

latch类型如下:
    MTR_MEMO_PAGE_S_FIX         /*rw_locks-latch*/
    MTR_MEMO_PAGE_X_FIX         /*rw_lockx-latch*/
    MTR_MEMO_BUF_FIX               /*buf_block_t*/
    MTR_MEMO_S_LOCK               /*rw_lock s-latch*/
    MTR_MEMO_X_LOCK               /*rw_lock x-latch*/

 

memo的latch管理接口
    mtr_memo_push                                       获得一个latch,并将状态信息存入mtr memo当中
    mtr_release_s_latch_at_savepoint       释放memo偏移savepoint的slot锁状态
    mtr_memo_contains                          判断锁对象是否在memo当中
    mtr_memo_slot_release                    释放slot锁的控制权
    mtr_memo_pop_all                            释放所有memo中的锁的控制权

mt_t中的log成员是也是一个dyn_array_t动态结构的内存,用来保存mtr产生的日志信息。日志的写入是通过mtr0log.h来写入的。这里指的一提的是日志格式,日志格式是有日志头和日志体组成,日志头信息是由type、space和page no组成,由mlog_write_initial_log_record_fast函数写入到mtr_t的log中的。以下是一个比较具体的示意图:

      

log body的数据写入是通过mtr0log.h中的日志写入方法进行写入的。每写入一跳操作日志,n_log_recs会加1.

标识modifications是标识是否有page的数据改动,如果有,在mtr_commit调用时会先将mtr->log刷盘,然后释放mtr所有的所控制权。日志会一定会在mtr结束时刷盘,这符合Force-log-at-commit的规定。日志写入调用的是log_write_low这个函数。

2.1 mtr_t的内存结构关系图



3 总结

mini transaction是innodb对ACID中的持久性的最小保证单元,所有涉及到事务执行、页数据刷盘、redo log数据恢复等都需要进行mini transaction的构造和执行。几乎所有的模块都涉及到mini transaction,例如:btree、page、事务、inser tbuffer、redo-log等,d对mini transcaion的理解不能孤立的去看源代码,应该结合redo log、page相关的代码了解。它是理解innodb工作原理的基石。



 

 

 

 



这篇关于MySQL系列:innodb源码分析之mini transaction的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095821

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

如何去写一手好SQL

MySQL性能 最大数据量 抛开数据量和并发数,谈性能都是耍流氓。MySQL没有限制单表最大记录数,它取决于操作系统对文件大小的限制。 《阿里巴巴Java开发手册》提出单表行数超过500万行或者单表容量超过2GB,才推荐分库分表。性能由综合因素决定,抛开业务复杂度,影响程度依次是硬件配置、MySQL配置、数据表设计、索引优化。500万这个值仅供参考,并非铁律。 博主曾经操作过超过4亿行数据

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言