Discuss / SQL / 幻读可能是因为锁的颗粒度问题

幻读可能是因为锁的颗粒度问题

Topic source

a_bumpy_night

#1 Created at ... [Delete] [Delete and Lock User]

脏读是因为在读是时候没有加共享锁,不可重复读是因为没有遵循两阶段加锁,即在释放锁之后不能申请锁,所有锁的申请必须在释放之前。幻读可能是因为锁的颗粒度问题。如果是严格按照两阶段锁的模型,即使读取不存在的元素,也要将该元素上锁,如果是这样的话,那insert语句会失败,也就不会有幻读的问题。但是mysql里面当使用索引时是使用行锁,在可重复读这个隔离级别不会为不存在键上锁,所以会存在幻读的问题。这个主要是为性能考虑,比如select x where x<= 90 这条语句,可能表里面只有x=3, x=50, x=100三条记录,如果要避免幻读只能把x=1到x=90都上锁,那样代价就太高了。

当然mysql也可能使用多版本时间戳的乐观锁,那机制可能就与上面不同了

mark,等需要了解原理的时候来理解这段话

mark毛,根本找不到记录的


  • 1

Reply