《Mysql如何解决幻读问题》一个工作4年的朋友去美团面试,遇到这样的问题。大家好,我是Mic,一名工作了14年的Java程序员。关于这个问题,面试官想调查什么?我们该如何回答?问题分析这道题至少考察有3年以上开发经验的同学。解决Mysql底层的并发事务问题,至少需要一定的技术积累才能真正理解。而如果你是刚工作不久的程序员,那你肯定知道数据库的事务隔离级别。因为不同的隔离级别对数据安全的影响是不同的。即存在脏读、幻读、不可重复读等问题。所谓幻读,就是一个事务前后两次读取的数据数量不一致。在第一个事务中执行范围查询。此时满足查询的数据只有一条。然后在第二个事务中插入了一条数据并提交,然后在第一个事务中再次查询时,发现有两条数据符合条件。在RR事务隔离级别下,引入了MVCC和LBCC两种方式来解决幻读问题。MVCC类似于乐观锁设计。简单的说就是为每笔交易生成一个交易版本,然后为这个版本定义访问规则。一个事务只能看到第一次查询之前已经提交的事务和当前事务。修订。事务看不到当前事务第一次查询后创建的事务,以及未提交的事务修改。但是,如果一个事务中有当前读,MVCC还是存在幻读问题,因为当前读并没有读取快照,而是直接读取内存。那么对于这种情况,可以在理解以上知识的基础上,使用LBCC这种基于锁的机制来解决,即行锁、表锁、间隙锁等,如果没有底层Mysql不同事务隔离级别的实现原理比较清楚的同学在回答这道题的时候,不是很生硬,就是无法展开,会显得有点像死记硬背答案。来看看专家是怎么回答这个问题的。Master:在RR(即可重复读)的事务隔离级别下,InnoDB使用MVCC机制来解决幻读问题。MVCC是一种乐观锁机制。它为不同的事务生成不同的快照版本,并通过UNDO版本链进行管理。MVCC中规定高版本可以看到低版本的事务变化,低版本看不到高版本。版本的事务变更实现了不同事务之间的数据隔离,解决了幻读问题。但是目前的读取情况是直接读取内存中的数据,跳过快照速度,所以还是会出现幻读的问题。我认为可以通过两种方式解决。一是尽量避免目前的阅读情况,二是引入LBCC。以上是我对这个问题的理解。总结一下,今天的分享就到这里了。喜欢我的作品记得点赞收藏关注!!!极品Java面试合集,金九银十面试秘籍扫底!版权声明:除特别声明外,本博客所有文章均采用CCBY-NC-SA4.0许可协议。转载请注明来自Mic带你学建筑!如果本文对您有帮助,请给个关注和点赞。您的坚持是我不断创作的动力。欢迎关注同名微信公众号获取更多技术干货!
