2018-07-27 MySql锁

从锁的粒度MySql分为行锁、表锁和页锁。 表锁的开销小,但是粒度大,并发冲突的概率大。行锁则相反 MyISAM引擎只支持表锁,InnoDB则可以支持行锁和页锁。 MyISAM引擎是表级锁,在执行select语句时,会自动给涉及的表加上读锁;在执行update/delete/insert语句时,会自>动给涉及的表加上写锁。 而InnoDB在做行锁的时候,锁住的是索引中的索引项,因此不走索引的话InnoDB执行的是表锁,这一点很重要。 并且如果两条记录对应同一个索引项,是会冲突的。

操作不当会造成锁表。查看mysql里被锁的表的命令:show OPEN TABLES where In_use > 0; show processlist; 命令可以查看进程的状态。然后根据信息kill调造成锁表的进程即可。

对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁

对于普通SELECT语句,InnoDB不会加任何锁;当然我们也可以显示的加锁: 共享锁:select * from tableName where … + lock in share more 排他锁:select * from tableName where … + for update

innodb中,如果加锁时锁索引成功,但是锁的不是唯一索引或者主键索引,变成next-key锁。

Innode有三种行锁:

  1. Record Lock :锁单个行记录
  2. Gap Lock:间隙锁,锁定一个范围,但是不包括范围本身。这是为了防止出现幻读的情况。
  3. Next-Key Lock:锁定一个范围,并且锁定记录本身。防止出现幻读情况。
Written on July 27, 2018