mysql mini transction_MySQL系列:innodb源码分析之mini transaction

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

1.mini transaction3个协议

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

1. The FIX Rules

2. Write-Ahead Log

3. Force-log-at-commit

1.1The FIX Rules

The FIX Rules规定以下:

修改1个页需要取得该页的x-latch

访问1个页是需要取得该页的s-latch或x-latch

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

1.2Write-Ahead Log

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

1.3 Force-log-at-commit

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

2 mini-transaction的日志实现

innodb是采取mini-transaction来构建操作的物理逻辑日志的,在事务履行的时候,会通过mtr来保证页的数据1致性和持久性。mini-transaction是通过1个mtr_t的结构来实现mini-transaction的3个协议。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                                       取得1个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成员是也是1个dyn_array_t动态结构的内存,用来保存mtr产生的日志信息。日志的写入是通过mtr0log.h来写入的。这里指的1提的是日志格式,日志格式是有日志头和日志体组成,日志头信息是由type、space和page no组成,由mlog_write_initial_log_record_fast函数写入到mtr_t的log中的。以下是1个比较具体的示意图:

b4e979d53a5059271c1f9722d63dc64f.png

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

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

2.1 mtr_t的内存结构关系图

e9b6a5d6c010bf04df53ff007bb67d5a.png

3 总结

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

log、page相干的代码了解。它是理解innodb工作原理的基石。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于C++&OPENCV 的全景图像拼接 C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值