MySQL的锁机制与锁算法

InnonDB引擎支持行级锁(row-level locking)和表级锁(table-level locking),默认为行级锁。

锁的分类:按照锁的粒度分类
表级锁: MySQL中锁定 粒度最大 的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,触发锁冲突的概率最高,并发度最低。
MyISAM和 InnoDB引擎都支持表级锁。

行级锁: MySQL中锁定 粒度最小 的一种锁,只针对当前操作的行进行加锁。 行级锁能大大减少数据库操作的冲突。其加锁粒度最小,并发度高,但加锁的开销也最大,加锁慢,会出现死锁。
InnoDB引擎才支持行级锁。

InnoDB支持的行级锁:

  1. Record Lock:对索引项加锁,锁定符合条件的行。其他事务不能修改和删除加锁项;
  2. Gap Lock:对索引项之间的“间隙”加锁,锁定记录的范围(对第一条记录前的间隙或最后一条将记录后的间隙加锁),不包含索引项本身。其他事务不能在锁范围内插入数据,这样就防止了别的事务新增幻影行。
  3. Next-key Lock:锁定索引项本身和索引范围。即Record Lock和Gap Lock的结合。可解决幻读问题。

注:InnoDB只有通过索引条件检索数据时才使用行级锁,否则,InnoDB将使用表锁。也就是说InnoDB的行级锁是基于索引的。

锁的分类:按照是否可写分类
共享锁(Share Lock):S锁,又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。

排他锁(Exclusive Lock):X锁,又称作写锁,若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。

另外两个表级锁:
意向共享锁(IS):表示事务准备给数据行记入共享锁,事务在一个数据行加共享锁前必须先取得该表的IS锁。

意向排他锁(IX):表示事务准备给数据行加入排他锁,事务在一个数据行加排他锁前必须先取得该表的IX锁。

注意:

  1. 意向共享锁可以同时并存多个,但是意向排他锁同时只能有一个存在。
  2. 意向锁是InnoDB自动加的,不需要用户干预。
  3. IX,IS是表级锁,不会和行级的X,S锁发生冲突,只会和表级的X,S发生冲突。
image.png

你可能感兴趣的:(MySQL的锁机制与锁算法)