MySQL: 锁

2023-09-20 10:49:06

一、table

CREATE TABLE `dog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `age` int(11) DEFAULT NULL,
  `weight` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `idx_age` (`age`)
) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8

二、插入数据:
在这里插入图片描述
三、主键上锁的测试(唯一索引和主键情况完全相同)
打开两个navicat窗口,分别执行set autocommit=0关闭自动提交。
1.在两个窗口分别执行:

select * from dog where id=35 lock in share mode;  

都不会阻塞。

2.一个窗口执行:

select * from dog where id=35 lock in share mode;  

另一个窗口执行:

select * from dog where id=35 for update;

则第二个窗口报:Lock wait timeout exceeded; try restarting transaction
3.一个窗口执行:

select * from dog where id=35 lock in share mode;  

另一个窗口执行:

update dog set weight=1111 where id=35;

则第二个窗口报:Lock wait timeout exceeded; try restarting transaction

结论:在主键上进行等值查询时,如果记录存在,则只会在记录上加记录锁。

4.一个窗口执行:

select * from dog where id=38 lock in share mode;  

id为38的记录并不存在
另一个窗口执行:

update dog set weight=1111 where id=40;

可以更新成功,但如果:

insert into dog(id,age,weight) values(37,8,32);
insert into dog(id,age,weight) values(39,8,32);


都会阻塞
结论:在主键上进行等值查询时,如果记录不存在,则只会把记录所在的区间右闭去掉,也就是加间隙锁,例如本例中,临键锁为(35,40],则实际加的为间隙锁(35,40)

5.一个窗口执行:

select * from dog where id>34 and id<40 lock in share mode;  

另一个窗口执行:

insert into dog(id,age,weight) values(32,8,32);

执行成功。
另一个窗口如果执行:

insert into dog(id,age,weight) values(38,8,32);

阻塞
结论:上述第一个查询,开始要经历2个间隙锁(30,35],(35,40]. 因为id>34这个条件命中了id=35这条记录,所以第一个间隙锁退化为记录锁,只锁定了id=35这条记录。因为id<40这个条件没有命中(35,40]这个临键锁的记录,所以临键锁退化为间隙锁(35,40),所以最终锁定的区间为[35,40),所以可以插入id 为32的数据,无法插入id为38的记录

四、普通索引上锁的测试:
1.一个窗口执行:

select * from dog where age=20 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(84,17,32);

insert into dog(id,age,weight) values(85,23,32);

都阻塞。
结论:普通索引,等值查询且记录存在时,会给记录所在的区间加临键锁,同时给其下一个临键锁区间上加间隙锁。上述第一个查询,首先会给(10,20]这个区间加临键锁,然后给(20,30)这个区间加间隙锁。因此,锁定的区间为(10,30),如下的语句将不会阻塞:

update dog set weight=3 where id=10;

update dog set weight=3 where id=30;
insert into dog(id,age,weight) values(85,7,32);


2.一个窗口执行:

select * from dog where age=43 for update;

age为43的记录不存在。
锁定的为(40,50)这个开区间
另一个窗口执行:

update dog set weight=3 where id=40;

update dog set weight=3 where id=50;

都执行成功。如果执行如下语句将阻塞

insert into dog(id,age,weight) values(86,42,32);
insert into dog(id,age,weight) values(86,45,32);

结论:普通索引,等值查询,记录不存在时,锁定记录所在的开区间

3.一个窗口执行:

select * from dog where age>44 and age< 48 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(86,42,32);
insert into dog(id,age,weight) values(86,49,32);

将阻塞。执行如下语句:

update dog set weight=6 where id=50;

成功。
分析:上述第一条语句锁定的是(40,50)这个开区间,也就是加了间隙锁。
如果将第一条语句改为:

select * from dog where age>23 and age<= 30 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(86,22,32);

insert into dog(id,age,weight) values(86,33,32);

都会阻塞
执行如下语句:

update dog set weight=35 where id=35;

将执行成功。
分析:上述第一条语句锁定的是(20,30]这个区间和(30,35)这个区间,也就是最总锁定(20,35)这个区间。

五、没有索引的列上锁的测试:
1.一个窗口执行:

select * from dog where weight=3 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(99,99,99);

则第二个窗口报:Lock wait timeout exceeded; try restarting transaction
2.一个窗口执行:

select * from dog where weight=34 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(99,99,99);

则第二个窗口报:Lock wait timeout exceeded; try restarting transaction

3.一个窗口执行:

select * from dog where weight>5 for update;

另一个窗口执行:

insert into dog(id,age,weight) values(1,1,1);

则第二个窗口报:Lock wait timeout exceeded; try restarting transaction

结论:当在没有索引的列进行锁定时,不管是等值查询查到了数据、等值查询没有查到数据、范围查询,都给相当于整个表加了表锁,其它事务无法对表进行任何插入或更新操作。

更多推荐

SwiftUI 5.0(iOS 17)TipKit 让用户更懂你的 App

概览作为我们秃头开发者来说,写出一款创意炸裂的App还不足以吸引用户眼球,更重要的是如何让用户用最短的时间掌握我们App的使用技巧。从iOS17开始,推出了全新的TipKit框架专注于此事。有了它,我们再也不用自己写App用户帮助以及使用指南的逻辑和界面了。使用TipKit非常简单,接下来就让我们一起走进TipKit

对于项目中爱抱怨成员,项目经理如何回应?

李佳刚被提拔成项目经理。他是技术部的骨干人员,工作能力很强,已经干了快五年了。公司规模中等,属于比较传统的制造型公司。随着公司升级转型,项目越来越多,难度也增加了。原来那种按部就班的订单式生产被更加灵活、个性化的客户需求所取代,不但技术难度提高了,完成一个项目所涉及的部门、协作单位也增多了。李佳由于出色的工作表现,因此

Java手写决策树和决策树应用拓展案例

Java手写决策树和决策树应用拓展案例1.算法思维导图以下是用mermaid代码表示的决策树算法实现原理的思维导图:#mermaid-svg-DWczpr7jTBRHS9bA{font-family:"trebuchetms",verdana,arial,sans-serif;font-size:16px;fill:#

JMeter:接口测试基础介绍

一、什么是接口接口是非常抽象的概念,先来看下中国最大的综合性辞典《辞海》是怎样定义接口的:两个不同系统或系统中两个不同特性部分的交接部分。一般分硬件接口和软件接口两种。前者是为连接计算机各部分之间、计算机与计算机之间、计算机与外部系统之间而专门设计的连接线及有关逻辑控制电路;后者是为连接两个程序层或块而专门设计的程序或

怎么在树莓派上搭建WordPress博客网站,并发布到外网可访问?

文章目录序幕概述1.安装PHP2.安装MySQL数据库3.安装Wordpress4.设置您的WordPress数据库设置MySQL/MariaDB创建WordPress数据库5.WordPressconfiguration6.将WordPress站点发布到公网安装相对URL插件修改config.php配置7.支持好友链

基于Java咖啡商品管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌🍅文末获取源码联系🍅👇🏻精彩专栏推荐订阅👇🏻不然下次找不到哟2022-2024年最全的计算机软件毕业设计选题

WebLOAD: 一站式性能测试工具

WebLOAD是一款一站式前端性能测试工具,对测试人员来说使用非常方便。它可以帮助前端工程师和测试快速对网页进行性能测试和优化,提高网页加载速度,减少页面卡顿和闪烁。WebLOAD的特点、使用指南以及企业实际使用中的案列。WebLOAD的特点功能丰富:WebLOAD集成了众多前端性能测试工具,如前端性能分析、首屏时间预

算法刷题 week1 找出数组中重复的数字&不修改数组找出重复的数字

目录week11.找出数组中重复的数字题目数据范围样例题解(数组遍历)O(n)2.不修改数组找出重复的数字题目数据范围样例题解(分治,抽屉原理)O(nlogn)week11.找出数组中重复的数字题目给定一个长度为n的整数数组nums,数组中所有的数字都在0∼n−1的范围内。数组中某些数字是重复的,但不知道有几个数字重复

MySQL

当谈到数据库管理系统时,MySQL通常是许多开发者和数据专业人士的首选。MySQL是一种开源的关系型数据库管理系统,广泛用于Web应用程序、企业应用程序和各种数据驱动的应用。在这篇博客中,我们将深入探讨MySQL的重要性、用途、基本概念以及如何开始使用它。什么是MySQL?MySQL是一个关系型数据库管理系统(RDBM

3.3 DLL注入:突破会话0强力注入

Session是Windows系统的一个安全特性,该特性引入了针对用户体验提高的安全机制,即拆分Session0和用户会话,这种拆分Session0和Session1的机制对于提高安全性非常有用,这是因为将桌面服务进程,驱动程序以及其他系统级服务取消了与用户会话的关联,从而限制了攻击者可用的攻击面。由于DLL注入在Se

警惕!多本SCI/SSCI被剔除,9月SCI/SSCI期刊目录已更新~(附下载)

【SciencePub学术】2023年9月20日,科睿唯安更新了WebofScience核心期刊目录。继上次SCI期刊目录和SSCI期刊目录更新之后,本次9月更新共有9本期刊发生变动:•SCIE:有3本期刊不再被SCIE期刊目录收录(EditorialDe-listing/ProductionDe-listing),1

热文推荐