mysql 的mvcc 作用
Mysql有四种隔离级别,分别是读未提交、读已提交、可重复读和串行化。mvcc可以实现读已提交和可重复读。对于读已提交,mvcc会在每次查询时生成ReadView快照,而对于可重复读会在第一次查询时生成ReadView快照。
mvcc的实现
mvcc的实现依赖于undo log版本链,和ReadView快照。
undo log中会保存事务的基本信息、当前事务id以及前一个undolog地址,日志与日志之间通过这样的链接形成了版本链。
ReadView快照中包含了正在执行的事务id数组(m_ids)、正在执行事务id的最小值(min_trx_id)、下一个要生成的id(max_trx_id)、创建ReadView的事务id(creator_trx_id)。
如何判断版本链中的某条日志内容是否对当前事务可见
if (trx_id<min_trx_id) {
该版本对当前事务可见
} else if (trx_id >= max_trx_id){
该版本对当前事务不可见
} else {
if (m_ids.contains(trx_id)) {
该版本对当前事务不可见
} else {
该版本对当前事务可见
}
}