美文网首页
MySQL锁的类型(摘抄)

MySQL锁的类型(摘抄)

作者: 吃掉夏天的怪物 | 来源:发表于2021-04-19 22:05 被阅读0次

https://www.bilibili.com/video/BV1yv41187tV?p=10&spm_id_from=pageDriver
基于锁的属性分类:共享锁、排它锁。
基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODE、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。
基于锁的状态分类:意向共享锁、意向排它锁。

  • 共享锁(Share Lock)

共享锁又称读锁,简称S锁;当一个事务为数据加上读锁之后,其它事务只能对该数据加读锁,而不能对数据加写锁,知道所有的读锁释放之后其它事务才能对其加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。

  • 排他锁(exclusive Lock)

排他锁又称写锁,简称X锁:当一个事务为数据加上写锁时,其它请求将不能再为数据加任何锁,直到该锁释放之后,其它事务才能对数据进行加锁。排他锁的目的是再数据修改的时候,不允许其它人同时修改,也不允许其它人读取。避免了出现脏数据和脏读问题。

  • 表锁

表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能对表进行访问。
特点:粒度大,加锁简单,容易冲突。

  • 行锁

行锁是指上锁的时候锁住的是表的某一行或多行记录,其他事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问
特点: 粒度小,加锁比表锁麻烦,不容易起冲突,相比表锁支持的并发要高。

  • 记录锁(Record Lock)

记录锁也属于行锁的一种,只不过记录的锁的范围只是表中的一条记录,记录锁是说事务再加锁后锁住的只是表的某一条记录。
精准条件命中,并且命中的条件字段是唯一索引
加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题。

  • 页锁

页级锁是MySQL中锁定粒度介于行级锁 和 表级锁之间的一种锁。表级锁速度快,但冲突多,行级锁冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。

  • 间隙锁(Gap Lock)

属于行锁的一种,间隙锁是在事务加锁后其锁住的是表记录中的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。
范围查询并且查询未命中记录,查询条件必须命中索引、间隙锁只会出现在REPEATABLE_READ(重复读)的事务级别中。
触发条件:放置幻读问题,事务并发的时候,如果没有间隙锁,就会发生如下图的问题,在同一个事务里,A事务的两次查询出的结果会不一样。
比如表里面的数据ID 为1,4,5,6,10,那么会形成以下几个间隙区间,-n-1区间,1-4区间,7-10区间,10-n区间(-n代表负无穷大,n代表正无穷大)

  • 临键锁(Next-Key Lock)

也属于行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。
触发条件:范围查询并命中,查询命中了索引
结合记录锁和间隙锁的特性,临键锁避免了在范围查询时出现脏读、幻读、重复读问题,加了临键锁之后,在范围区间内数据不允许修改和插入。

如果事务A加锁成功之后就设置一个状态告诉后面的人,已经有人对表里加了一个排他锁了,你们不能对整个表加共享锁或排它锁了,那么后面需要对整个表加锁的人只需要获取这个状态就知道自己是不是可以对表加锁,避免了对整个索引树的每个节点扫描是否加锁,而这个状态就是意向锁。

  • 意向共享锁

当一个事务试图对整个表进行加共享锁之前,首先需要获得这个表的意向共享锁。

  • 意向排它锁

当一个事务试图对整个表进行加排它锁之前,首先需要获得这个表的意向排它锁。

相关文章

  • MySQL锁的类型(摘抄)

    https://www.bilibili.com/video/BV1yv41187tV?p=10&spm_id_f...

  • MySQL学习笔记-死锁产生原因和解决方法

    Mysql 锁类型 一、锁类型介绍: MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出...

  • MySQL死锁产生原因和解决方法

    Mysql 锁类型 一、锁类型介绍: MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出...

  • MySQL死锁及解决方案

    1 MySQL锁类型 1. MySQL常用存储引擎的锁机制 MyISAM和MEMORY采用表级锁(table-le...

  • 2021-01-26

    4、MySQL锁类型? 根据锁的类型分,可以分为共享锁,排他锁,意向共享锁和意向排他锁。 根据锁的粒度分,又可以分...

  • MySQL锁

    MySQL锁介绍 按照锁的粒度来说,MySQL主要包含三种类型(级别)的锁定机制: 全局锁:锁的是整个databa...

  • MySQL锁类型

    两种行级锁(row-level locking) 共享锁(S):事务执行read时,可以持有这个锁 排它锁(X):...

  • 5.MySQL的事务与锁(2)

    本章要点 1.锁类型2.锁范围3.死锁 1.锁类型 1.1 锁粒度分类 MySQL 里面的锁大致可以分成全局锁、表...

  • Mysql的几个灵魂拷问(三)

    今天这篇就来讲讲Mysql中比较高频的锁和事务吧。 一、Mysql锁事 1、锁的类型有哪些呢 总的来说,InnoD...

  • MySQL的锁机制

    锁的类型 MySQL的锁分为:行级锁、表级锁、页级锁 MyISAM 和 Memory 存储引擎使用的是表级锁 In...

网友评论

      本文标题:MySQL锁的类型(摘抄)

      本文链接:https://www.haomeiwen.com/subject/fppwlltx.html