MySQL系列:innodb源码分析之mini transaction
来源:互联网 发布:网络暴力电影 编辑:程序博客网 时间:2024/05/18 00:26
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的定义如下:
其中成员memo是个latch持有状态的数组列表,采用的是dyn_array_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 总结
- MySQL系列:innodb源码分析之mini transaction
- MySQL系列:innodb源码分析之mini transaction
- MySQL系列:innodb源码分析之mini transaction
- MySQL系列:innodb源码分析之基础数据结构
- MySQL系列:innodb源码分析之线程并发同步机制
- MySQL系列:innodb源码分析之文件IO
- MySQL系列:innodb源码分析之表空间管理
- MySQL系列:innodb源码分析之page结构解析
- MySQL系列:innodb源码分析之重做日志结构
- MySQL系列:innodb源码分析之redo log恢复
- MySQL系列:innodb源码分析之表空间管理
- MySQL系列:innodb源码分析之文件IO
- MySQL系列:innodb源码分析之page结构解析
- MySQL系列:innodb源码分析之重做日志结构
- MySQL系列:innodb源码分析之redo log恢复
- MySQL系列:innodb源码分析之线程并发同步机制
- MySQL: mini-transaction简析
- MySQL系列:innodb源码分析之内存管理
- IoC的概念——看到一篇写的通俗易懂文章
- Android中一些基本功能的实现
- jquery绑定json数据到不同类型的标签中
- Android开发中App演示Gif效果动画的制作过程详讲
- 《JAVA与模式》之单例模式
- MySQL系列:innodb源码分析之mini transaction
- 简单ftp实现
- WSgi+Django+websocket的实现
- 关于Java的10个谎言
- 命令模式
- CodeBlocks 的安装以及编译器的配置
- 分布式系统session同步
- 使用Nginx后如何在web应用中获取用户ip及原理解释
- js 生成随机数字(1-9)数字键盘