“Mysql 如何解决幻读问题”
一个工作了 4 年小伙伴,去一个美团面试,遇到了这样一个问题。
大家好,我是 Mic,一个工作了 14 年的 Java 程序员
对于这个问题,面试官想考查什么?咱们应该如何答复呢?
问题解析
这个问题至多考查的是 3 年以上开发教训的同学。
Mysql 底层去解决并发事务问题,至多是要有肯定的技术积攒能力真正了解。
而如果作为一个刚工作没多久的程序员,必须要晓得数据库的事务隔离级别的问题。
因为不同的隔离级别对于数据的安全性影响是不同的。
也就是存在脏读、幻读、不可反复读等问题。
所谓幻读,就是一个事务前后两次读取到的数据条数不统一。
在第一个事务外面执行一个范畴查问,这个时候满足查问的数据只有一条。
接着第二个事务外面插入一条数据并且提交了,而后在第一个事务外面再次查问的时候发现有两条数据满足条件。
在 RR 事务隔离级别下,引入了 MVCC 和 LBCC 这两种形式来解决幻读问题。
MVCC 相似于一种乐观锁的设计,简略来说就是针对每个事务生成一个事务版本,而后针对这个版本定义了拜访规定
- 一个事务只能看到第一次查问之前曾经提交的事务以及以后事务的批改。
- 一个事务不能看到以后事务第一次查问之后创立的事务,以及未提交的事务批改。
然而,如果在一个事务外面存在以后读的状况下,MVCC 还是会存在幻读问题,因为以后读不是读快照,而是间接读内存。
所以针对这种状况,能够应用 LBCC 也就是基于锁的机制来解决,也就是常说的行锁、表锁、间隙锁等
基于对上述常识的了解,如果没有对 Mysql 不同事务隔离级别的底层实现原理有一个清晰意识的同学在答复这个问题的时候,要么就是很僵硬,要么就是无奈扩大,就会显得有点像是在背答案。
上面看看高手是怎么答复这个问题的吧。
高手:
在 RR(也就是可反复读)的事务隔离级别下,InnoDB 采纳了 MVCC 机制来解决幻读问题。
MVCC 就是一种乐观锁的机制,它通过对不同事务生成不同的快照版本,通过 UNDO 版本链进行治理并且在 MVCC 外面,规定了高版本可能看到低版本的事务变更,低版本看不到高版本的事务变更从而实现了不同事务之间的数据隔离,解决了幻读的问题。
然而在以后读的状况下,是间接读取内存的数据,跳过了快照度,所以还是会呈现幻读问题。
我认为能够通过两个形式来解决。
- 第一种是尽量避免以后读的状况
- 第二种是引入 LBCC 的形式
以上就是我对这个问题的了解。
总结
好了,明天的分享就到这里完结了
如果喜爱我的作品,记得点赞、珍藏、关注!!!
须要 Java 面试合集,金九银十面试秘籍扫下方!
版权申明:本博客所有文章除特地申明外,均采纳 CC BY-NC-SA 4.0 许可协定。转载请注明来自
Mic 带你学架构
!
如果本篇文章对您有帮忙,还请帮忙点个关注和赞,您的保持是我一直创作的能源。欢送关注同名微信公众号获取更多技术干货!