MySQL中的锁之二:行锁、页锁、表锁

MySQL中按照锁的粒度能够细分为行锁、页锁、表锁。
图片描述并发

  • 行锁
  1. 行锁的锁定颗粒度在MySQL中是最细的,应用于InnoDB存储引擎,只针对操做的当前行进行加锁。并发状况下,产生锁等待的几率较低,支持较大的并发数,但开销大,加锁慢,并且会出现死锁。
  2. 在InnoDB中使用行锁有一个前提条件:检索数据时须要经过索引!由于InnoDB是经过给索引的索引项加锁来实现行锁的。
  3. 在不经过索引条件查询的时候,InnoDB会使用表锁,这在并发较大时,可能致使大量的锁冲突。此外,行锁是针对索引加锁,存在这种状况,虽然是访问的不一样记录,但使用的是同一索引项,也可能会出现锁冲突。
    提示:不必定使用了索引检索就必定会使用行锁,也有可能使用表锁。由于MySQL会比较不一样执行计划的代价,当全表扫描比索引效率更高时,InnoDB就使用表锁。所以须要结合SQL的执行计划去分析锁冲突。
  4. 行锁会产生死锁,由于在行锁中,锁是逐步得到的,主要分为两步:锁住主键索引,锁住非主键索引。如:当两个事务同时执行时,一个锁住了主键索引,在等待其余索引;另外一个锁住了非主键索引,在等待主键索引。这样便会发生死锁。InnoDB通常均可以检测到这种死锁,并使一个事务释放锁回退,另外一个获取锁完成事务。

  • 表锁
    表锁的锁定颗粒度在MySQL中是最粗的,InnoDB、MyISAM引擎中都有应用,对当前整张表加锁。不适合高并发的场景,但开销小,加锁快,不会出现死锁,发生锁冲突的几率最大。

  • 页锁 页锁的粒度介于行锁和表锁之间,应用于BDB引擎,并发度通常,开销和加锁速度也介于行锁和表锁之间。
相关文章
相关标签/搜索