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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具。在计算机中,是协调多个进程或县城并发访问某一资源的一种机制...
    蹲厕所的熊阅读 665评论 0 0
  • 目录:1.锁的定义与分类(表、行、页)2.锁相关的语句(查看锁)3.mysql事务4.乐观锁和悲观锁5.数据库死锁...
    lbcBoy阅读 3,748评论 1 6
  • 数据库锁 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比...
    Mongogo阅读 241评论 0 0
  • 对于DB来说,经常会面对并发问题,但是开发的时候DB总是能很好的解决并发的问题。那么面对并发DB是怎么进行控制的呢...
    一只小哈阅读 2,453评论 2 34
  • 像终于寻到了天堂,像宇宙走进了洪荒。 世人永不明白的是,海枯石烂地久天长是等待的周长,是追寻的时光,是一寸一寸看岁...
    眠M_阅读 431评论 0 1