文档介绍:InnoDB 事务/锁/多版本分析
网易杭研-何登成
个人简介
•姓名:何登成
•工作:
–就职于杭州网易研究院,进行自主研发的TNT存储引擎的架构设计/研发工作
•联系方式
–邮箱:@
–微博:何_登成
–主页:/
InnoDB存储引擎
•模块划分
– OS层
–锁
–事务
–多版本
–日志/恢复
–索引
•列/行/页面/Extent/Segment/Tablespace/File
– Buffer Pool
– Handler层
–...
大纲
• InnoDB事务
–事务结构/功能
– XA事务/mit
– mini-transaction
• InnoDB锁
–锁结构/类型/功能
–锁等待/死锁检测
–自增序列锁(autoinc lock)
–半一致读(semi-consistent read)
–隐式锁(implicit lock)
• InnoDB多版本
– ReadView
–聚簇索引/二级索引
–快照读
– Index Only Scan
– RC vs RR
– Purge
• InnoDB事务/锁/多版本总结
InnoDB事务/锁/多版本
InnoDB事务-结构
InnoDB事务-结构(cont.)
• trx_sys(全局唯一)
– mutex: critical section,控制事务的分配/提交/回滚
– max_trx_id: 当前系统最大的事务号
分配256次,写一次文件,持久化
– trx_list: 系统当前所有活跃事务链表
– view_list: 系统当前所有ReadView链表
• trx_struct(事务对象)
– id/no: 事务号,标识事务起始/提交顺序
• id用户可见,no用户不可见;共用trx_sys的max_trx_id进行分配
– xid: XA事务标识
–(global)read_view: 事务所属的ReadView
– trx_locks: 事务持有的所有lock(表锁/记录锁/Autoinc锁)
– wait_lock: 事务当前正在等待的lock
InnoDB事务-功能
•快照读
–创建ReadView,实现RC/RR隔离级别(时分析)
•当前读
–对表/记录加锁
–同一事务,所有的锁,链成链表
• I/U/D
–加锁
–记录undo日志/redo日志
•数据持久化
– mit
•需要哪些操作?
•数据回滚
–事务rollback
•需要哪些操作?
InnoDB事务-XA事务
• Why XA?
–为了保证InnoDB redo log与MySQL binlog的一致性
– backup
• mit流程
– InnoDB prepare -> mit -> mit
– Binlog作为事务协调器
– Transaction Coordinator
–参数
– MySQL: sync_binlog
– InnoDB:mit
• mit
– MariaDB/Percona -rel24/MySQL
InnoDB事务-mini-transaction
• mini-transaction(微事务)
–定义
• mini-transaction不属于事务;InnoDB内部使用
•对于InnoDB内所有page的访问(I/U/D/S),都需要mini-transaction支持
–功能
•访问page,对page加latch (只读访问:S latch;写访问:X latch)
•修改page,写redo日志(mtr本地缓存)
• page操作结束,提交mini-transaction (非事务提交)
–将redo日志写入log buffer
–将脏页加入Flush List链表
–释放页面上的 S/X latch
–总结
• mini-transaction,保证单page操作的原子性(读/写单一page)
• mini-transaction,保证多pages操作的原子性(索引SMO/记录链出,多pages访问的原子性)