MVCC解决幻读

请求各位大佬,MVCC为什么不能避免幻读呢?根据版本号,每次SELECT出来的数据的创建版本号不是都小于当前事务版本号,那怎么还有幻读呢?#笔试题目#
全部评论
你得看看快照读和当前读
7 回复 分享
发布于 2019-08-22 15:54
举个例子,假设说数据库里有一张表一共有3列,第一列是自增主键,隔离级别为RR级别。 原先数据库表里有3条数据 1 1 1 2 2 2 3 3 3 ------- 此时我开启一个事务A,执行一下select * ,然后再开启一个事务B,insert一条 444并commit。 之后再回到事务A,再次执行select *,毫无疑问111222333,符合可重复读。 再然后我执行一条 sql :update 第三列 = 5 之后再select  结果为 1 1 5 2 2 5 3 3 5 4 4 5 -------- 此时发生了幻读,要解决这个问题也很简单,楼上基本说了,就不多解释了。 如有错误麻烦指出。
点赞 回复 分享
发布于 2019-08-22 16:32
mvcc是快照读,本身就解决了幻读,当前读的情况下,用间隙锁解决了幻读
点赞 回复 分享
发布于 2019-08-22 16:23
RR级别下每个事务会创建一个快照,RR级别默认第一条SQL才创建快照,依据快照中记录的事务的高水位和低水位判断数据是否可见,低于低水位的必然可见,高于高水位的不可见,如果介于两者之间,也处于活动中的事务id的数据不可见,由此解决的,
2 回复 分享
发布于 2019-08-22 16:03
select是非锁定读,本来就不会幻读,update这种锁定读才会出现幻读,需要使用间隙锁避免幻读
点赞 回复 分享
发布于 2019-08-22 15:59
谁跟你说的每次查出来的数据的版本号都小于当时事务编号的??
点赞 回复 分享
发布于 2019-08-22 15:59
mvcc解决的是可重复读问题,next Key lock解决幻读问题
点赞 回复 分享
发布于 2019-08-22 15:55
select属于快照读操作,不会出现幻读,只有update、delete这种当前读操作才会出现幻读现象。 幻读的话,我给你举个例子,假如A事务正在查询id<10的所有数据,只存在id为1~7的数据,8、9并不存在,此时B事务向数据库插入id为8的数据,那么事务A就会出现幻读现象,本来是不存在id为8的数据的,但是像出现幻觉一样读取到了,这就是幻读。 解决的办法是加上next-key锁(也就是行锁+gap锁),gap锁会锁着id为8、9的两个位置,阻止事务A读取数据的时候,事务B向数据库插入数据,这样就避免幻读了
4 回复 分享
发布于 2019-08-22 16:31
mvcc可以解决幻读,因为读取的是一个历史的快照。如果对数据实时性要求高的话,不推荐。
点赞 回复 分享
发布于 2019-08-22 20:31
可以避免。分快照读,当前读
点赞 回复 分享
发布于 2019-08-22 19:27
因为mvcc里面的update是当前读?求大佬解释
点赞 回复 分享
发布于 2019-08-22 16:18
能避免幻读吧,或者可重复读+间隙锁
点赞 回复 分享
发布于 2019-08-22 15:56
可重复读级别下通过间隙锁,应该是能解决幻读的问题
点赞 回复 分享
发布于 2019-08-22 15:54
不是默认开启了next keylock 已经避免幻读了吗
点赞 回复 分享
发布于 2019-08-22 15:52
不能避免幻读??
点赞 回复 分享
发布于 2019-08-22 15:51
幻读是会发现多了数据或者少了数据吧
点赞 回复 分享
发布于 2019-08-22 15:49

相关推荐

05-28 11:49
已编辑
门头沟学院 golang
查看23道真题和解析
点赞 评论 收藏
分享
距离第一次面试刚刚好过去一个月,总算是oc了,后面也不打算再找了,所以简单做个总结bg双九科班简历牛客论坛+黑马点评,有个挑战杯大模型相关比赛决赛一等奖无实习经历,LeetCode除hot100之外有额外刷一些,大概200左右,八股一般,主要背了redis相关大概4月初开始投,虽然bg让我有不少面试机会,但大多都是一面挂,只有阿里智能信息顺利oc,鹅的复活赛进了一次二面。总结失败经验:没有实习经验、项目烂大街加上最开始确实没有完全吃透,基本一深入问就g以下记录一下时间线:美团&nbsp;4.23&nbsp;一面挂阿里国际&nbsp;4.29&nbsp;一面挂腾讯&nbsp;5.8&nbsp;一面挂阿里云&nbsp;5.9&nbsp;一面挂腾讯复活赛一番战&nbsp;5.13&nbsp;一面&nbsp;5.20二面挂淘天&nbsp;5.14&nbsp;一面挂(阿里妈妈的压迫感太强了)腾讯音乐&nbsp;5.14&nbsp;一面挂阿里智能信息&nbsp;5.15一面&nbsp;5.20二面&nbsp;5.23HR面&nbsp;HR面后三小时oc其实还投了不少,饿了么笔试没后续,蚂蚁笔试没后续,OPPO笔试挂,虾皮笔试挂,阿里控股、京东还在池子里,很早就投的顺丰发了个面试时间意向邮件后无后续以下是面经:美团、阿里国际、阿里智能信息已单独发腾讯一面:讲讲session和cookie,了不了解单点登录csrf攻击布隆过滤器讲讲cas讲讲redis里的数据结构,跳表有了解吗热帖排行功能展开讲讲讲讲你项目里的分布式锁acid、隔离级别,mysql默认是哪个级别,为什么ioc和aop手撕:连续子数组的最大和其实这次面试体验还挺好,就是单点登录问题面试官前面暗示了很多次,最后直截了当问了,但我这块当时确实没准备到淘天一面:除了maven还有什么管理第三方包;如何处理maven依赖冲突AC自动机了解吗布隆过滤器threadlocal,如何跨线程传递值mysql的锁了解吗,什么情况下会产生死锁商品数量多时如何考虑分库分表redisson自动续锁怎么解决死锁问题get和post的区别;为什么get中带url是不安全的循环依赖是什么,spring中如何解决,适用于什么情况ioc、aop讲讲为什么要做这两个项目csrf手撕快排,讲原理被拷打最狠的一集,阿里妈妈不愧是阿里妈妈,是我完全高攀不起了腾讯复活赛一番战一面:static的作用final和finally的区别==和equals的区别为什么有了equals还需要hashcode为什么重写&nbsp;equals()&nbsp;时必须重写&nbsp;hashCode()&nbsp;方法?ioc和aopredis有哪些部署架构讲讲redisson对分布式锁的优化,什么情况下只使用单体redis手撕:删除有序链表中的重复值都是很基础的八股
点赞 评论 收藏
分享
评论
1
35
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务