Mysql(Innodb)如何避免幻读

Mysql(Innodb)如何避免幻读 有意思

MySQL InnoDB支持三种行锁定方式:

  •   行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。
  •   间隙锁(Gap Lock):锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。
  •   Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。

  锁选择

  • 如果更新条件没有走索引,例如执行”update from t1 set v2=0 where v2=5;” ,此时会进行全表扫描,扫表的时候,要阻止其他任何的更新操作,所以上升为表锁。
  • 如果更新条件为索引字段,但是并非唯一索引(包括主键索引),例如执行“update from t1 set v2=0 where v1=9;” 那么此时更新会使用Next-Key Lock。使用Next-Key Lock的原因:
  1. 首先要保证在符合条件的记录上加上排他锁,会锁定当前非唯一索引和对应的主键索引的值;
  2. 还要保证锁定的区间不能插入新的数据。
  • 如果更新条件为唯一索引,则使用Record Lock(记录锁)。
  • InnoDB根据唯一索引,找到相应记录,将主键索引值和唯一索引值加上记录锁。但不使用Gap Lock(间隙锁)

InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析

猜你喜欢

转载自www.cnblogs.com/ytys/p/9831745.html