采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
翔仔哥,最近在查阅学习笔记的时候,在RR级别下避免幻读这一块有了新的困惑,gap锁是锁的间隙如锁住了id为(6,9],那我在另一个事务中插入了非gap锁范围的id为10的数据是可以插入了,那事务A不就出现了幻读吗? 我的意思就是gap锁,锁住的只是一个小范围,非该范围的数据还是可以插入数据,不就还是会出现幻读吗 我手动实验了一下,发现事务B插入非gap范围之后的数据成功并提交后,在事务A中用快照读select * from tb1查询的数据是没有幻读的,但用当前的就有了
同学好,首先咱们来理解下幻读,
幻读指的是,事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。
像同学上面说的通过当前读确实会产生幻读,因为看起来"多"出数据了,但是RR级别下,是可以通过快照读来避免幻读的,这个就是咱们讲数据库知识的时候说过的知识,这里正好加深巩固下,加油:)
我通过实验是观察到RR级别快照读可以避免幻读,我疑惑的是,您说的快照读是表象,内在是gap锁+行锁,但是gap锁一般锁的是一个区间,在其他区间依然能够插入数据,虽然快照读可以避免,那为什么gap锁是内在呢,它一般不会全表上gap锁啊,我就是理解成表锁>=gap锁>行锁,没有想明白gap锁为什么成为RR级别避免幻读的内在原因,gap锁一般锁区间,表锁不是更加可以避免幻读吗,就是没想通gap锁的特别之处,还请翔仔哥解惑啊,感谢!
同学好,里面说的内在是指RR是如何实现的哈,不是通过快照读按照版本控制来实现的,而是通过gap锁+行锁来实现的RR,gap+行锁避免不了幻读,而快照读避免了幻读
哦,这下清楚了
登录后可查看更多问答,登录/注册
招聘季即将到来,让百度资深面试官来为你的高薪Offer保驾护航
1.8k 27
2.7k 22
1.2k 15
1.4k 14
1.3k 14