概念
MVCC(Multi-Version Concurrency Control)多版本并发控制,用于实现高并发读写操作。
说明
MVCC只有在事务隔离界别:读已提交(Read Commited)和可重复读(Repeatable Read)的隔离接别下工作。
原理
MVCC是借助UndoLog和ReadView实现的。
关于UndoLog
- 当事务执行修改数据操作时,Undo Log 记录了旧值的备份,以便在事务回滚或其他需要时恢复数据;并且会在最新记录的隐藏字段DB_ROLL_PTR中记录上一版本UndoLog地址
- UndoLog还用在事务回滚中
关于ReadView
首先介绍一下几个重要参数:
- m_ids:记录所有当前记录活跃事务的id列表
- min_trx_id:记录m_ids中最小值
- max_trx_id:记录m_ids中最大值的下一个值
- creator_trx_id:记录生成ReadView时的事务id
说明:
在Read Commited隔离级别,每次查询都需要创建新的ReadView
在Repeatable Read隔离级别,在事务开始前创建ReadView,在本事务中所有查询都用这一个ReadView,不会再次去创建ReadView。
MVCC工作原理
- 判断记录中隐藏字段trx_id是否在m_ids中
- 如果在,则说明trx_id事务还处于活跃状态(没有提交或者回滚),该版本记录对当前事务不可见
- 如果不存在,则说明trx_id事务已经提交,该版本记录对当前事务可见
- 如果trx_id<min_trx_id,说明是在当前事务创建ReadView前已经提交,该版本记录对当前事务可见
- 如果trx_id==creator_trx_id,说明当前事务对记录进行修改,在同一个事务内肯定时可见
- 如果trx_id>=max_trx_id,说明最新版本记录是在当前事务之后修改的,该版本记录对当前事务不可见
按照以上逻辑,当前事务获取最新版本记录来判断可见不可见,如果可见则直接返回该版本记录,如果不可见则需要根据隐藏列DB_ROLL_PTR来查询上个版本记录,继续按照以上逻辑进行判断,直到找到可见版本。
这个东西还是有些抽象,有些绕,大家多花点时间肯定能想通,能搞明白的!!!