什么是mvcc,面试的时候怎么说
文章目录第一部分底层实现的三大支柱1. 隐藏字段数据在哪2. Undo Log 版本链历史怎么找3. Read View看哪一条第二部分可见性判断逻辑核心算法第三部分面试进阶——RC 与 RR 的区别面试话术示例满分回答 小贴士在面试中聊MVCCMulti-Version Concurrency Control多版本并发控制你不能只背定义。面试官想看的是你能不能把“它是怎么工作的”和“为什么它能提高并发”这两件事讲透。简单一句话概括MVCC 是一种通过维护数据的多个快照版本让“读-写”操作不再互相阻塞从而提升数据库并发性能的机制。第一部分底层实现的三大支柱在面试时建议按照“数据存哪→历史怎么找→看哪一条”的逻辑来回答。1. 隐藏字段数据在哪InnoDB 在表的每一行数据后面都偷偷加了两个关键的隐藏列DB_TRX_ID记录最后一次修改该行的事务 ID。DB_ROLL_PTR回滚指针指向该行数据存在undo log里的上一个版本。2. Undo Log 版本链历史怎么找每当你更新一条记录旧的数据并不会被物理删除而是被塞进undo log里。隐藏字段里的回滚指针会将这些旧版本串联起来形成一条版本链。3. Read View看哪一条这是 MVCC 的“指挥官”。当你执行SELECT时InnoDB 会生成一个Read View读视图它像一张当前活跃事务的“系统快照”包含m_ids当前系统里还没提交的事务 ID 列表。min_trx_idm_ids里最小的 ID。max_trx_id系统即将分配给下一个事务的 ID。第二部分可见性判断逻辑核心算法这是面试的高潮部分。你需要描述事务是如何顺着“版本链”寻找自己能看的数据的拿起版本链中最新记录的trx_id。如果trx_id min_trx_id说明这个版本在你开启查询前就提交了可见。如果trx_id max_trx_id说明这个版本是在你开启查询后才生成的不可见。如果在两者之间检查trx_id是否在m_ids列表里。如果在说明事务还没提交不可见。如果不在说明事务已经提交可见。不可见怎么办顺着回滚指针去找上一个版本重复上述判断。第三部分面试进阶——RC 与 RR 的区别这是面试官最喜欢的“陷阱题”。MVCC 是如何实现不同隔离级别的RC读已提交事务中每一次SELECT都会重新生成一个 Read View。所以如果你在两次查询之间有别人提交了你能看到最新的。RR可重复读事务中只有第一次SELECT会生成Read View之后整个事务都复用这一个。所以不管别人怎么改你看到的永远是初恋的样子。面试话术示例满分回答面试官讲讲你对 MVCC 的理解。你MVCC 是 InnoDB 实现“读-写”并发的核心。它的底色是“空间换时间”让读操作不加锁也就是我们常说的“快照读”。实现上它主要靠三样东西隐藏列存事务 ID 和回滚指针。Undo Log形成数据的历史版本链。Read View这是一套可见性算法。核心逻辑就是当一个事务去读数据时它会生成一个 Read View。然后顺着 Undo Log 的版本链用自己的 Read View 规则去比对每个版本的事务 ID。如果是RC 级别它每次查都生成新视图所以会发生不可重复读如果是RR 级别它整个事务只在第一次查询时生成视图从而保证了可重复读并且在很大程度上避免了幻读。 小贴士如果面试官问“MVCC 能完全解决幻读吗”你要严谨一点不能完全解决。它能解决“快照读”下的幻读但如果发生了“当前读”比如执行了SELECT ... FOR UPDATE还是需要靠Next-Key Lock记录锁间隙锁来封印。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2556929.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!