MVCC,多版本并发控制。
通过保存数据的历史版本,根据比较数据的版本号来决定数据的是否显示,在不需要加读锁的情况就能达到事务的隔离效果,最终可以在读取数据的时候可以同时进行修改,修改数据时候可以同时读取,极大的提升了事务的并发性能。
名词 | 解释 |
---|---|
事务版本号 | 一个事务开启后都会获得一个自增长的事务的ID,由此判断先后顺序 |
trx_id | 记录操作该数据事务的事务ID |
roll_pointer | 相当于一个指针,指向回滚段的undo日志 |
row_id | 单调递增的行ID,不是必需的,占用6个字节 |
undo log | 回滚日志,用于记录数据被修改前的信息 |
版本链 | 多个事务并行操作某一行数据时,不同事务对该行数据的修改会产生多个版本,然后通过回滚指针,连成一个链表 |
快照读 | 读取的是记录数据的可见(有旧版本)版本(不加锁) |
当前读 | 读取的是记录数据的最新版本(显式加锁) |
Read View | 执行SQL语句时产生的读视图,判断当前事务可见哪个版本的数据 |
m_ids | 当前系统活跃未提交的所有事务ID(列表) |
up_limit_id | 生成Read View时,当前系统中活跃的读写事务中最小的事务id |
low_limit_id | 生成Read View时,系统中应该分配给下一个事务的id值 |
creator_trx_id | 创建当前Read View的事务ID |
说明一下Read View的匹配规则。
(1)如果m_ids包含trx_id,则代表Read View生成时刻,这个事务还未提交,但是如果数据的trx_id等于creator_trx_id的话,表明数据是自己生成的,因此是可见的。
(2)如果m_ids包含trx_id,并且trx_id不等于creator_trx_id,则Read View生成时,事务未提交,并且不是自己生产的,所以当前事务也是看不见的;
(3)如果m_ids不包含trx_id,则说明你这个事务在Read View生成之前就已经提交了,修改的结果,当前事务是能看见的。