《innodb存储引擎》学习笔记 chapter13 事务

acid
隔离级别
事务系统段(物理):事务、回滚段段头、mysql二进制位置(启动二进制文件时,数据库与存储引擎一致性)、双写段,四者信息

内存
事务系统对象
trx_sys_struct:{

双写对象 段头
活跃事务链表(有序)
内部事务链表
回滚段对象数组
回滚段内存对象链表
最近使用回滚段
快照链表
}

单个事务对象
事务信息

undo日志(事务提供互斥量)
read_view
trx_struct{
type:user、purge
state:notstart、active、commit(mem)
id
进入commit(mem)全剧最大trx id
mysqllog name&offset
事务link
保存点
回滚段
insert update undo日志
roll limit:回滚到的undo日志
undo_no_arr
持有锁链表
等待的锁
死锁标记
readview对象链表

}

双写段:保证至少一个副本有效
分配空间:跳过碎片页,保证写入顺序(碎片页不顺序)

内存结构trx_doublewrite_t(buffer) 全局:trx_doublewrite
{
mutex
block1、2 对象第一个第二个区开始的page no
write buffer

}

undo日志:原子性(back),一致性非锁定读(快照)
实现:
回滚段:undo段段头在页中offset
段头信息保存在相应段对象中

{
history&size:已提交事务链表(purge可回收)
}
对象
{
id
mutex
段头页&offset
最大undo页数量、当前
update\insert undo 日志链表
最近未被purge的事务编号、undo日志位置(page no &offset)
}

undo段(undo页集合)
undo log 段头(只存在于第一个undo页中)
undo log 页头(类型:insert、delete; 页中最新事务undo日志位置; 空闲空间offset; 页链表)
undo log 日志
(创建undo日志时需记录重做日志)
trx_undo_struct{
id
type
state
事务id
ddl mark
ddl 表id
回滚段
日志页 spaceid
undo log header位置:表空间、页offset
last page no
页 size
isempty
最后一个undo log 的位置(页 offset、缓冲池页)
最后一个undo log 的 undo no
}

undo页可重用,

undo记录header+ record
逻辑日志(不能将页回滚,防止影响其他事务)
header{
事务id
del mark
ddl?
ddl table id
pre next header

}
insert update单独段

record:
insert:不需要purge(因为对其他事务不可见),提交后立即删除
update、delete:需要
{
回滚指针
记录id

purge:
删del mark记录(判断快照),触发删段
将日志以commit顺序 存放在history link

内存对象:
trx_purge_struct{

}

回滚段history与undo段 需在一个mtr
标记删除页(防中断)

rollback
rollPtr——undo log record——上一版本ptr
回滚整个事务、回滚保存点、

commit
回滚也需要提交,释放事务资源:undo段、锁、readview。刷新重做日志
mysql事务系统段更新

上一篇:OCP 062中文考试题库(cuug内部资料)第6题


下一篇:MVCC简介