MySQL中锁的类型

文章详细介绍了MySQL中的锁类型,包括基于属性的分类(如排他锁和共享锁)以及基于粒度的分类(行级锁、表级锁和页级锁)。排他锁防止数据被修改,共享锁支持并发读取。行级锁提供更高并发,而表级锁锁定整个表。意向锁用于预测事务将请求的锁类型,提高加锁效率。
摘要由CSDN通过智能技术生成

一、基于属性的分类

  1. 共享锁是读锁
  2. 排它锁是写锁

1. 排他锁

exclusive lock,又称为写锁,简称X锁;当一个事务为数据加上写锁时,其他请求将不能再为数据加任何锁,直到该锁释放之后,其他事务才能对数据进行加锁。

目的是在数据修改时候,不允许其他人同时修改,也不允许其他人读取,避免了出现脏数据和脏读的问题

2. 共享锁

share lock,又称读锁,简称S锁;当一个事务为数据加上读锁之后,其他事务只能对该数据加读锁,而不能对数据加写锁,直到所有的读锁释放之后其他事务才能对其进行加写锁。

特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。

3. 相关问题

读锁加上写锁之后,没法确定读的是写之前还是写之后的内容。因此这样是存在问题的。

读锁再加上读锁是可以的,因为多个读取操作并不会改变数据的记录行。不会改变数据的实际结果值。

二、基于粒度分类

行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb引擎)、记录锁、间隙锁、临键锁。

你锁定的范围越大,意味是越容易的,因为你只要取某个区间就可以了(效率越高)。

当你锁定的范围越小,你需要操作或者指定某一行数据时,他的定位或者锁都是比较麻烦的(效率越低)。

1. 行级锁

行锁是指上锁的时候锁住的是表的某一行或多行记录,其他事务访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问。

特点:粒度小,加锁比表锁麻烦,不容易冲突,相比表锁支持的并发要高。

1.1 记录锁

行锁中的一种,只不过记录锁的范围只是表中的某一条记录,记录锁是说事务在加锁后锁住的只是表的某一条记录。加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事务未提交前被其他事务读取的脏读问题

1.2 间隙锁

行锁的一种,间隙锁是在事务加锁后其锁住的是表记录的某一个区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。范围查询并且查询未命中记录,查询条件必须命中索引、间隙锁只会出现在REPEATABLE_READ(重复读)的事务级别中。

1.3 临键锁

行锁的一种,并且它是INNODB的行锁默认算法,总结来说它就是记录锁和间隙锁的组合,临键锁会把查询出来的记录锁住,同时也会把该范围查询内的所有间隙空间也会锁住,再之它会把相邻的下一个区间也会锁住。

2. 表级锁

表锁是指上锁的时候锁住的是整个表,当下一个事务访问该表的时候,必须等前一个事务释放了锁才能对表进行访问。

特点:粒度大,加锁简单,容易冲突。

3. 页级锁

MySQL InnoDB存储引擎支持页级锁。这种锁的粒度介于行级锁和表级锁之间,锁定的是数据页。

它是MySQL中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以为了折衷的页级,一次锁定相邻的一组记录

特点:开销和加锁事件界于表锁和行锁之间,会出现死锁;锁定粒度界于表锁和行锁之间。并发度一般。

三、基于状态分类

  1. 意向共享锁
  2. 意向排它锁。

意向锁是一种表明事务将要请求什么类型锁的锁。

意向锁通常用于辅助系统在给定事务请求锁之前,判断是否会与其他事务的锁冲突。

先是对大粒度加锁,再对小粒度加锁。意向锁能提高我们加锁的效率。

参考资料:【5分钟背八股】84:mysql锁的类型有哪些?

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值