共享锁与排它锁 + 意向锁+记录锁

简介: 【8月更文挑战第3天】

#
共享锁和排它锁是在互斥的角度上看待锁的。

  • 共享锁是指一个线程加锁之后,其他线程还是可以继续加同类型的锁
  • 排它锁是指一个线上加锁之后,其他线上就不能再加锁了

概念很接近写锁和读锁,因为读锁本身就是共享的,而写锁就是排它的。

相当于一个信号,告诉别人我要加锁了,所以意向锁并不是一个真正物理意义上的锁。
意向锁和共享锁、排它锁结合,就有了意向共享锁和意向排它锁。

  • 意向共享锁:希望获得一个共享锁
  • 意向排它锁:希望获得一个排它锁

意向锁的意向重点就是想要拿到这个锁,但是最终能否拿到这个锁,是不确定的

在MySQL里,使用意向锁的场景是在增删改查的时候,对表结构定义加一个意向共享锁,防止在查询的时候有人修改表结构;在修改表结构的时候,加一个意向排它锁,这也就是修改表结构的时候直接阻塞掉所有增删改查语句的原因。使用意向锁可以提高数据库的并发性能避免死锁问题。

记录锁、间隙锁和临键锁是面试中最难理解的三个概念
记录锁是指锁住了特定的某一条记录的锁,例如SELECT * FROM your_tab WHERE id = 31 FOR UPDATE,在使用了主键作为查询条件,并且是相等条件下,将只命中一条记录,这一条记录就会被加上记录锁。但是如果查询条件里没有命中任何记录,那么就不会使用记录锁,而是使用间隙锁

如果使用唯一索引作为条件,比如user表里有一个email列是唯一索引,那么这条查询语句也是使用记录锁。类似,如果email='your_email' 这条记录不存在,那么会变成一个间隙锁。

SELECT * FROM your_tab WHERE email='your_email' FOR UPDATE

举个例子,如果数据库只有id为(1,4,7)的三条记录,也就是id=3这个条件没有命中任何数据,那么这条语句会在(1,4)这里加上间隙锁,所以,在生产环境里遇到了未命中索引的情况,对性能影响很大

MySQL里本身是加临键锁的,但是临键锁本身是由间隙锁和记录锁合并组成的,所以这里先用间隙锁描述

目录
相关文章
|
4月前
|
数据库 索引 关系型数据库
乐观锁和悲观锁+行锁和表锁
【8月更文挑战第2天】
61 8
|
4月前
|
SQL 关系型数据库 MySQL
临键锁引发的死锁
【8月更文挑战第4天】
44 0
临键锁引发的死锁
|
4月前
|
数据库 SQL
间隙锁+临键锁
【8月更文挑战第1天】
51 0
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
MySQL数据库——锁-行级锁(行锁、间隙锁和临键锁)
121 0
|
6月前
|
SQL 存储 关系型数据库
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
MySQL数据库——锁-表级锁(表锁、元数据锁、意向锁)
294 0
|
7月前
|
SQL 存储 关系型数据库
MySQL表锁、行锁、排它锁和共享锁
MySQL表锁、行锁、排它锁和共享锁
89 0
MySQL表锁、行锁、排它锁和共享锁
|
7月前
|
SQL 存储 关系型数据库
MySQL 意向共享锁、意向排他锁、死锁
MySQL 意向共享锁、意向排他锁、死锁
89 0
MySQL 意向共享锁、意向排他锁、死锁
|
7月前
|
数据库 数据安全/隐私保护
什么是行级锁和表级锁
什么是行级锁和表级锁
132 0
共享锁(读锁)和排他锁(写锁)
共享锁(读锁)和排他锁(写锁)
206 0
|
SQL 关系型数据库 MySQL
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
!! 背景:最近在各种群和博客里,又看见了什么[乐观锁]、悲观锁什么鬼的感觉很高级的词汇,于是乎今天对这几个概念进行整理一下,揭开它神秘的面纱,给大家提供一个基本参考。作为开发人员不管是用什么编程语言,我觉得这些是应该要掌握的。知其然,知其所以然。 锁机制是 MySQL 中用来保证并发访问数据库时数据一致性和完整性的重要机制。在并发访问中,多个事务可能同时对同一份数据进行操作。如果不采用锁机制,就会出现数据错乱和丢失的问题。MySQL 中的锁机制主要包括以下几种类型:
328 0