可重复读是否能解决幻读?
在可重复读的情况下,MySQL引入MVCC,但MVCC并没有真正解决了幻读。
可重复读开启了间隙锁,而间隙锁解决了幻读。
所以在可重复读下用间隙锁或next key锁才可以防止幻读。不使用间隙锁是无法解决幻读的。其实在读提交下检测唯一索引的唯一性也会开启间隙锁。
注意,这里说的是针对同一条数据。
如果针对同一个表但是不是同一条数据,那么可以说,不遵循前提条件,嗯,就是间隙锁之外,锁不住的就无法解决幻读问题。在间隙锁之内的,就能解决幻读。
看面试官是否认为这是同一条数据吧。
如何解决幻读?
很明显可重复读的隔离级别没有办法彻底的解决幻读的问题,如果我们的项目中需要解决幻读的话也有两个办法:
- 使用串行化读的隔离级别
- MVCC+next-key locks:next-key locks由record locks(索引加锁) 和 gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)
其实幻读也大可不必一定要消除,毕竟幻读也是可以接受的。
但面试中面试官问你如何消除幻读,你回答说 把隔离级别改成 串行化 那是不行的。
MVCC 和 幻读 的例子、详细过程的可以参考:https://juejin.cn/post/6844903799534911496
上次更新: 2024-05-23 10:33:15