Mysql 行锁 间隙锁 临键锁
行锁
mysql 中 innodb 存储引擎支持行锁,我们平常默认使用的也是innodb存储引擎,因为innodb 引擎中有mvcc 的控制,所以我们要想测试的时候就需要手动来显示加锁
- 共享锁 select .... lock in share mode
- 排他锁 select ... for update insert update delete
演示
有以下表
+----+------+------+
| id | name | addr |
+----+------+------+
| 1 | xxx | 1 |
| 4 | ccc | 2 |
| 7 | 1 | 4 |
| 10 | fff | 6 |
+----+------+------+
其中id 为自增主键
开启两个客户端,设置事务手动提交
客户端1 | 客户端2 |
mysql> mysql> |
mysql> mysql> |
mysql> select *from student where id = 1 lock in share mode; mysql> |
mysql> select *from student where id = 1 lock in share mode; mysql> |
select *from student where id =1 for update ; (被阻塞) |
|
mysql> commit; Query OK, 0 rows affected (0.01 sec) |
|
mysql> select *from student where id =1 for update ; +----+------+------+ | id | name | addr | +----+------+------+ | 1 | xxx | 1 | +----+------+------+ 1 row in set (0.00 sec) |
由上表我们可以得出,共享锁可以多个客户端获取,当客户端1要获取排他锁的时候,因为客户端2事务没有提交,依然占有共享锁,所以客户端1被阻塞,直至客户端2事务提交,同样排他锁的获取也是独占的
间隙锁
表
+----+------+------+
| id | name | addr |
+----+------+------+
| 1 | xxx | 1 |
| 4 | ccc | 2 |
| 7 | 1 | 4 |
| 10 | fff | 6 |
+----+------+------+
客户端1 | 客户端2 |
mysql> set autocommit=0; mysql> |
mysql> set autocommit=0; mysql> |
mysql> select *from student where id >20 for update ; Empty set (0.00 sec) |
|
mysql> (被阻塞) |
|
commit; | |
插入成功 |
客户端1加排他锁来查询大于20的记录,客户端2在插入11的时候会被阻塞,这是因为,客户端1在查询的时候会对记录加间隙锁,我们当前表的间隙有 (负无穷,1),(1,4),(4,7),(7,10),(10,正无穷),当我们执行 select *from student where id >20 for update ;的时候就会对 (10,正无穷)加锁,所以客户端2会被阻塞,但是这里的10是开区间,也就是说如果客户端2对10进行修改是不会阻塞的。同样如果我们执行 select *from student where id >7 and id <10 for update ; 就会对(7,10)加间隙锁,这里的间隙锁都是没有加在记录上,如果加在了记录上就会变成临键锁,即行锁加间隙锁
临键锁
表
+----+------+------+
| id | name | addr |
+----+------+------+
| 1 | xxx | 1 |
| 4 | ccc | 2 |
| 7 | 1 | 4 |
| 10 | fff | 6 |
+----+------+------+
客户端1 | 客户端2 |
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) |
mysql> set autocommit=0; Query OK, 0 rows affected (0.00 sec) |
mysql> select *from student where id >4 and id <10 for update; +----+------+------+ | id | name | addr | +----+------+------+ | 7 | 1 | 4 | +----+------+------+ 1 row in set (0.00 sec) |
|
mysql> insert into student values(8,'x','x'); (被阻塞) |
客户端1执行select *from student where id >4 and id <10 for update;会对(4,7】,(7,10】加锁,即 7和10 也会被锁住,即间隙(4,7),(7,10)和 行锁 7 和10;但是对4进行修改将不会阻塞
注意
上述的所有操作都是基于索引的,如果不通过索引加锁的话,锁就会升级为表锁,索引失效也会升级为表锁,其次在演示的时候所有的操作都显示的加锁,因为mvcc机制,不显示加锁的话会产生快照读
Mysql 行锁 间隙锁 临键锁相关推荐
- MySQL中的各种锁(行锁、间隙锁、临键锁等等LBCC)
目录 1.快照读和锁定读 1.1 一致性读 / 快照读 1.2 锁定读 1.2.1 共享锁和独占锁 1.2.2 锁定读的语句 1.2.2.1 Lock In Share Mode 对记录加S共享锁 1 ...
- Mysql里的锁(排它锁、共享锁、行锁、表锁、间隙锁、临键锁、意向锁)
一.加锁的目的是什么? 在我们了解数据库锁之前,首先我们必须要明白加锁的目的是为了解决什么问题,如果你还不清楚的话,那么从现在起你应该知道,数据库的锁是为了解决事务的隔离性问题,为了让事务之间相互不影 ...
- MySQL的锁机制 - 记录锁、间隙锁、临键锁
记录锁(Record Locks) 记录锁是 封锁记录,记录锁也叫行锁,例如: SELECT * FROM `test` WHERE `id`=1 FOR UPDATE; 它会在 id=1 的记录上加 ...
- 5.MySQL行锁、表锁、间隙锁详解
一.表锁 表锁不依赖于储存引擎(不管你是MySQL的什么存储引擎,对于表锁的策略都是一样的),开销小(因为力度大).表锁不会产生死锁问题,但是表锁会影响并发率. 表锁不依赖索引,当索引失效的时候,行 ...
- MySQL(七)关于MySQL不同版本下临键锁锁定范围不同
MySQL InnoDB底层的锁实现算法分为三种 : 记录锁,间隙锁,临键锁. 之前在验证MySQL的临键锁的时候使用docker安装的最新版本的MySQL镜像,发现其临键锁在最新的MySQL的表现和 ...
- MySQL数据库InnoDB存储引擎中的锁机制--转载
原文地址:http://www.uml.org.cn/sjjm/201205302.asp 00 – 基本概念 当并发事务同时访问一个资源的时候,有可能导致数据不一致.因此需要一种致机制来将访问顺序化 ...
- MySQL数据库的锁 --- 六种分类 - 14种锁详细介绍
MySQL锁概述 锁是计算机协调多个进程或线程并发访问某一个资源的机制,在数据库中,除传统的计算资源(CPU.RAM.I/O)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性 ...
- mysql innodb 的锁机制_Mysql之Innodb锁机制详解
InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION):二是采用了行级锁.关于事务我们之前有专题介绍,这里就着重介绍下它的锁机制. 总的来说,InnoDB按照不同的分类共有 ...
- mysql 锁 代码_MySQL中的锁实例
表结构: id:自增主键,a:无索引,b:普通索引 CREATE TABLE `test` ( `id` int(11) NOT NULL AUTO_INCREMENT, `a` int(4) NOT ...
- mysql行锁同索引键问题_mysql 锁问题 (相同索引键值或同一行或间隙锁的冲突)
1.使用相同索引键值的冲突 由于mysql 的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但如果是使用相同的索引键,是会出现锁冲突的.设计时要注意 例如:city表city_ ...
最新文章
- 失败原因_解析干洗店失败原因
- 第三篇:时间和全局状态(三)
- sql之left join、right join、inner join的区别,连接自己时的查询结果测试
- 高德面试官问我:JVM内存溢出后服务还能运行吗,我一顿操作行云流水
- mysql 8.0 手动安装教程_mysql 8.0.13手动安装教程
- 1218 溢出设置 overflow
- 计算机组成原理—浮点数
- 【转】 Android xml中 @和?区别,style和attr小结
- 电脑芯片和服务器芯片,王思聪的服务器和我们的电脑有什么区别?
- 最新诺顿病毒库报暴风影音7.0有毒![原]
- python新浪_Python——新浪新闻抓取
- Windows Server 2016安装SCCM2019
- 基于闪存存储原理的U盘数据安全测试和U盘数据保护软件
- 2022-01-15:中心对称数 III。 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。 写一个函数来计算范围在 [low, high] 之间中心对称数的个
- 通用图床服务架构解析(百万级回源/天)
- NBOOT分析-S3C244xInit.s(1)
- 解决笔记本IPS屏幕发黄问题
- 买眼镜踩坑【吐槽一下实体店的坑】
- 如何在eclipse创建maven工程
- 16秋计算机与技术鲁嘉华第一章作业