MySql锁机制(全网最全、最详细、最清晰)

news2024/9/28 15:31:13

1、MySql锁机制

锁机制的作用:

解决因为资源共享,而造成的并发问题。

没有锁机制时:

例如一号用户和二号用户都要去买同一件商品(假如这件商品是一件衣服),一号用户手速稍微快了一些,于是就先买到了这件衣服,但是因为没有“锁机制”,于是就造成了二号用户不知道这件衣服已经被人买了,所以就造成了“并发问题”。

有锁机制时:

但是有了“锁机制”,一号用户在买了衣服之后就会“对衣服进行加锁”,二号用户看到“衣服被加锁了”,于是就去“等待着衣服被解锁”。

在“衣服未被解锁”的过程中,衣服则会被一号用户进行“试穿”、“下单”、“付款”、“打包”、或者“不满意,取消订单”一系列的操作,这一系列操作之后“衣服会被解锁”。

如果一号用户这边觉得衣服还行打算买下来,在买完之后“衣服就会被解锁”,二号用户这边看到“衣服被解锁了”就会去查看衣服是否还存在,很明显已经不存在了,因为一号用户已经把衣服买了,如果一号用户“不满意,取消订单”,那么二号用户这边就可以购买这件衣服。

因此通过锁机制就很好的解决了买衣服造成的并发问题。

2、MySql锁的分类

按照“操作类型”分:

1、读锁(也叫“共享锁”):

对同一个数据(衣服),多个读操作可以同时进行,互不干扰。

2、写锁(也叫“互斥锁”)

如果当前写操作没有完毕(买衣服的一系列操作),则无法进行其他的读操作、写操作。

按照“操作范围”分:

1、表锁 :

一次性对一张表整体加锁。如MyISAM存储引擎使用表锁,开销小、加锁快;无死锁;但锁的范围大,容易发生锁冲突、并发度低。

2、行锁(与表锁的特性完全相反):

一次性对一条数据加锁。如InnoDB存储引擎使用行锁,开销大,加锁慢;容易出现死锁;锁的范围较小,不易发生锁冲突,并发度高(很小概率发生高并发问题:脏读、幻读、不可重复度、丢失更新等问题)。

3、页锁(几乎遇不见)

页锁的开销介于表锁和行锁之间,会出现死锁。锁定粒度介于表锁和行锁之间,并发度一般。

3、MySql表锁示例

准备工作:

1、创建两张表,表table和表lock

create table tab(
id int primary key auto_increment , 
name varchar(20)
)engine myisam;
insert into tab(name) values('tab1');
insert into tab(name) values('tab2');
insert into tab(name) values('tab3');
insert into tab(name) values('tab4');
insert into tab(name) values('tab5');
create table locktab(
id int primary key auto_increment , 
name varchar(20)
)engine myisam;
insert into locktab(name) values('locktab1');
insert into locktab(name) values('locktab2');
insert into locktab(name) values('locktab3');
insert into locktab(name) values('locktab4');
insert into locktab(name) values('locktab5');

2、再新建两个会话

加锁相关命令:

1、增加锁:

lock table 表1 read/write,表2 read/write,...;

2、释放锁:

unlock tables;

3、查看加锁的表:

show open tables;

加读锁(也叫“共享锁”):

会话192.168.11.101(1):

给表locktab加读锁:

lock table locktab read;
select * from locktab; --执行读操作(查),可以

delete from locktab where id =1; --执行写操作(增删改),不可以

操作没有加锁的表tab:

select * from tab; --读操作,不可以
delete from tab where id = 1; --写操作,不可以

结论:

1、如果某一个会话对A表加了read锁,则该会话可以对A表进行读操作、不能进行写操作;且该会话不能对其他表进行读、写操作。

2、即如果给A表加了读锁,则当前会话只能对A表进行读操作。

会话192.168.11.101(2),也就是其它会话:

操作加锁了的表locktab:

select * from locktab; --读操作(查),可以

delete from locktab where id =1; --写操作,会“等待”会话192.168.11.101(1)将锁释放

操作没有加锁的表tab:

select * from tab;  --读操作(查),可以
delete from tab where id = 1; --写操作(增删改),可以

再来在“会话192.168.11.101(1)”中把锁释放了,看看“delete from locktab where id =1;”是否会释放阻塞:

总结:

“会话192.168.11.101(1)”给表locktab加了锁,其他会话的操作:

1、可以对其他表(表locktab以外的表)进行读、写操作。

2、对表locktab:读操作可以,写操作需要等待释放锁。

加写锁(也叫“互斥锁”):

会话192.168.11.101(1):

给表locktab加读锁:

lock table locktab write;
select * from locktab; --读操作,可以
delete from locktab where id = 5; --写操作,可以

操作没有加锁的表tab:

select * from tab; --读操作,不可以
delete from tab where id = 3; --写操作,不可以

总结:

当前会话(会话192.168.11.101(1))可以对加了写锁的表进行任何操作(增删改查),但是不能操作(增删改查)其他表。

会话192.168.11.101(2):

操作加锁了的表locktab:

select * from locktab; --写操作,会阻塞

delete from locktab where id = 2; --写操作,也会阻塞

对“会话192.168.11.101(2)”中加写锁的表可以进行增删改查的前提是:等待“会话192.168.11.101(1)”释放写锁。

操作没加锁的表tab:

select * from tab; --读操作,可以
delete from tab where id = 2; --写操作,可以

MySQL表级锁的锁模式:

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(DML)前,会自动给涉及的表加写锁。

所以对MyISAM表进行操作,会有以下情况:

1、对MyISAM表的读操作(加读锁),不会阻塞其他进程(会话)对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。

2、对MyISAM表的写操作(加写锁),会阻塞其他进程(会话)对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。

分析表锁定:

查看哪些表加了锁:

show open tables

1代表被加了锁

分析表锁定的严重程度:

show status like 'table%';

Table_locks_immediate:即可能获取到的锁数。

Table_locks_waited:需要等待的表锁数(如果该值越大,说明存在越大的锁竞争)。

一般建议:

Table_locks_immediate/Table_locks_waited > 5000, 建议采用InnoDB引擎,否则MyISAM引擎。

4、MySql行锁示例

准备工作:

unlock tables; --需要先释放之前加的表锁
create table linelock(
id int(5) primary key auto_increment,
name varchar(20)
)engine=innodb ;
insert into linelock(name) values('1');
insert into linelock(name) values('2');
insert into linelock(name) values('3');
insert into linelock(name) values('4');
insert into linelock(name) values('5');

为了研究行锁,暂时将自动commit关闭,“set autocommit = 0;”,以后需要通过“commit”关键字提交写操作:

set autocommit = 0;

mysql默认自动commit,oracle默认不会自动commit。

行锁,操作同一条数据:

会话192.168.11.101(1):写操作

insert into linelock values(6,'a6');

会话192.168.11.101(2):写操作,同样的数据

update linelock set name='ax' where id = 6;

总结:

1、如果会话x对某条数据a进行DML操作(研究时:关闭了自动commit的情况下),则其他会话必须等待会话x结束事务(commit/rollback)后,才能对数据a进行操作。

2、表锁是通过unlock tables,也可以通过事务解锁;行锁是通过事务解锁。

行锁,操作不同数据:

会话192.168.11.101(1): 写操作

insert into linelock values(8,'a8');

会话192.168.11.101(2): 写操作,不同的数据

update linelock set name='ax' where id = 5;

总结:

行锁,一次锁一行数据;因此如果操作的是不同数据,则不干扰。

行锁的注意事项:

1、如果没有索引,则行锁会转为表锁

先给字段“name”加个索引:

show index from linelock;

可以看到有一条索引,这是主键索引,建表创建主键的时候自动加的。

这是mysql的基础,无论是创建主键还是外键都会自动创建主键索引或外键索引。

给name加个索引:

alter table linelock add index idx_linelock_name(name);

会话192.168.11.101(1): 写操作

update linelock set name = 'ai' where name = '3';

会话192.168.11.101(2): 写操作,不同的数据

update linelock set name = 'aiX' where name = '4';

可以看到在索引没有失效的情况下所有会话都可以对数据进行写操作。

会话192.168.11.101(1): 写操作

update linelock set name = 'ai' where name = 3;

会话192.168.11.101(2): 写操作,不同的数据

update linelock set name = 'aiX' where name = 4;

可以发现,数据被阻塞了(加锁)。

原因:如果索引列发生了类型转换,则索引失效。 因此此次操作,会从行锁转为表锁。

2、行锁的一种特殊情况:间隙锁:值在范围内,但却不存在。

此时linelock表中 没有id=7的数据:

“update linelock set name ='x' where id >1 and id<9;”即在此where范围中,没有id=7的数据,则id=7的数据成为间隙。

间隙:Mysql会自动给间隙加锁(间隙锁)。即会自动给id=7的数据加间隙锁(行锁)。

行锁:如果有where,则实际加锁的范围就是where后面的范围(不是实际的值)。

如果仅仅是查询数据,能否加锁? 可以使用for update:

select * from linelock where id =2 for update;

通过for update对query语句进行加锁。

mysql中,以下三种方式都可以将自动提交关闭:

set autocommit =0;
start transaction;
begin;

行锁:

InnoDB默认采用行锁。

缺点:

比表锁性能损耗大。

优点:

并发能力强,效率高。

因此建议,高并发用InnoDB,否则用MyISAM。

行锁分析:

show status like '%innodb_row_lock%';

Innodb_row_lock_current_waits:当前正在等待锁的数量。

Innodb_row_lock_time:等待总时长。从系统启动到现在一共等待的时间。

Innodb_row_lock_time_avg:平均等待时长。从系统启动到现在平均等待的时间。

Innodb_row_lock_time_max:最大等待时长。从系统启动到现在最大一次等待的时间。

Innodb_row_lock_waits:等待次数。从系统启动到现在一共等待的次数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/139504.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从事软件测试需要学自动化么

相信许多对软件测试有过一点了解的人&#xff0c;对自动化都不会感到陌生。我们常常会听到一定软件测试人员一定要学自动化的说法&#xff0c;那么很多人都会有这样的疑问&#xff0c;从事软件测试为什么要学自动化&#xff1f;事实上&#xff0c;如今只会功能测试的从业者往往…

光波导成为AR眼镜迭代新趋势,二维扩瞳几何光波导潜力彰显

关注AR眼镜的朋友可能都会发现&#xff0c;近期新品迭代的一个趋势是持续在小型化、轻量化方向演进。与一年前光学方案主要以BirdBath不同的是&#xff0c;消费级AR眼镜正快速向光波导方案探索和转变。这一点在最近发布的众多新品AR眼镜中就能明显的感受到&#xff0c;以视享G5…

堆排序 TopK 优先级队列的部分源码 JAVA对象的比较

一.堆排序:我们该如何借助堆来对数组的内容来进行排序呢&#xff1f; 假设我们现在有一个数组&#xff0c;要求从小到大进行排序&#xff0c;我们是需要进行建立一个大堆还是建立一个小堆呢&#xff1f; 1)我的第一步的思路就是建立一个小堆&#xff0c;因为每一次堆顶上面的元…

MGRE和ospf的综合运用

目录实验需求知识点实验过程一&#xff0c;在R1 R2 R3中的MGRE搭建二&#xff0c;在R1 R4 R5中的MGRE搭建三&#xff0c;整个内网的ospf协议实验需求 一 题目要求 1&#xff0c;R6为ISP代表运营商&#xff0c;只能配置ip地址&#xff0c;R1-R5环回 代表私有网段 2&#xff0c…

【Linux】顶级编辑器Vim的基本使用及配置

&#x1f451;作者主页&#xff1a;进击的安度因 &#x1f3e0;学习社区&#xff1a;进击的安度因&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux 文章目录一、前言二、vim基本概念三、vim 基本操作1、模式切换2、命令模式3、插入模式4、底行模式四…

[Vue的数据绑定]一.Vue的数据绑定;二.Vue的事件绑定;三.Class和Style的绑定;四.Vue的过滤器;五.Vue脚手架的使用

目录 一.Vue的数据绑定 1.单向数据绑定&#xff1a;将Model绑定到View上&#xff0c;当通过JavaScript代码改变了Model时&#xff0c;View就会自动刷新。不需要进行额外的DOM操作就可以实现视图和模型的联动 &#xff08;1&#xff09;插值表达式&#xff1a;{{ 表达式 }}&am…

pandas 使用

import pandas as pd a [3,7,2] myvar pd.Series(a,index["x","y","z"]) print(myvar["x"]) #结果是3 #给序列赋值index &#xff0c;然后可以根据index找到对应的数 data {"col1": range(-5,0), "col2": r…

半入耳式耳机适合跑步吗、最适合跑步的五款耳机分享

好的跑步耳机可以帮助您跑得更努力、更快和更久。研究发现&#xff0c;听音乐可以提高跑步成绩&#xff0c;尤其是在速度方面。同时&#xff0c;随着音乐锻炼可以提高跑步者的速度并减少精神疲劳&#xff0c;帮助您自信地打破这些束缚。那么目前市面上有哪些无线耳机是适合跑步…

【算法】分治算法(第三章习题解答)

3 分治算法 3.1 设 AAA 是 nnn 个非 000 实数构成的数组, 设计一个算法重新排列数组中的数, 使得负数都排在正数前面. 要求算法使用 O(n)O(n)O(n) 的时间和 O(1)O(1)O(1) 的空间. 算法设计&#xff1a;由于算法要求使用 O(n)O(n)O(n) 的时间和 O(1)O(1)O(1) 的空间&#xff0…

力扣sql入门篇(八)

力扣sql入门篇(八) 1 订单最多的客户 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 SELECT customer_number FROM Orders GROUP BY customer_number having count(order_number)(SELECT max(o1.number)FROM (SELECT count(order_number) numberFRO…

电压放大器在超声导波声弹特性的液压管路压力检测中的应用

实验名称&#xff1a;电压放大器在超声导波声弹特性的液压管路压力检测中的应用 研究方向&#xff1a;超声检测 实验目的&#xff1a; 为实现农机装备液压系统的非介入式压力检测&#xff0c;在分析适合压力检测的超声导波声弹敏感模态与激励频率的基础上&#xff0c;搭建了一套…

用埃式筛法来求解素数。————C++

目录埃式筛法埃式筛法求解某一个数字包含的所有素数数组Code运行结果埃式筛法判断某一个数字是否为素数Code运行结果埃式筛法 首先要了解什么式埃式筛法之前&#xff0c;需要知道一个定理。 就是素数的整数倍一定不是素数。 了解了这个就基本大概懂了埃式筛法。 首先初始化…

C语言线性表实现:顺序表

文章目录&#xff1a;概念理解&#xff1a;1. 动态顺序表结构体&#xff1a;2. 顺序表动态初始化&#xff1a;3. 顺序表扩容&#xff1a;4. 插入&#xff1a;5. 删除&#xff1a;6. 按位序查找&#xff1a;7. 按值查找&#xff1a;8. 输出顺序表&#xff1a;9. 判断顺序表是否相…

UniSCA漏洞优先级排序

当谈到开源漏洞时&#xff0c;我们会发现它们似乎永远处于增长状态。事实上&#xff0c;UniSCA的开源风险报告显示&#xff0c;与2021年同期相比&#xff0c;2022年前9个月添加到UniSCA漏洞数据库中的开源软件漏洞数量增长了33% 。然而&#xff0c;虽然有些漏洞会带来严重的业务…

Altium Designer 20 凡亿教育视频学习-04

第四部分学习 unknow pin错误原因 将原理图导入到PCB时会出现问题 管脚未使用报错 导入PCB器件全部绿 删掉下面的紫红色框架即可&#xff08;Sheet2&#xff09; 视频讲的方法是&#xff1a;一开始把所有的规则删掉&#xff0c;只保留电气规则 板子大小评估-把器件聚集在一…

16---实现权限菜单管理(一)

1、实现角色管理 建role表 USE management; DROP TABLE IF EXISTS role;CREATE TABLE role (id int(11) NOT NULL AUTO_INCREMENT COMMENT id,name varchar(50) DEFAULT NULL COMMENT 名称,description varchar(255) DEFAULT NULL COMMENT 描述,PRIMARY KEY (id) ) ENGINEInn…

活动星投票最美空姐网络评选微信的投票方式线上免费投票

如何进行“最美空姐”的投票活动_投票小程序投票_投票助力方式大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。我们现在要以“最美空姐”为主题进行一次投票活动&#xff0…

Docker 三剑客

Docker 三剑客包括Docker Machine、Docker Compose、Docker Swarm。 1. Docker Machine 1.1 简介 Docker Machine 是 Docker 官方三剑客项目之一&#xff0c;使用它可以在多个平台上快速安装部署Docker环境&#xff0c;还可以在短时间内快速构建起一套Docker主机集群。 Do…

最近手头有点紧,于是用Python来冲一波股票...

文章目录前言准备工作获取数据部分爬虫的基本流程代码展示数据可视化分析最后前言 快过年了&#xff0c;手头有点紧&#xff0c;但是作为一个男人&#xff0c;身上怎么能够没有大把钞票呢&#xff1f; 于是我决定用Python来分析一波股票&#xff0c;赢了会所嫩*&#xff0c;输…

在线设计邀请函

不用ps就能制作邀请函的工具&#xff01;在线就能搞定你的邀请函设计和链接分享&#xff01;只要跟着小编下面的设计步骤&#xff0c;掌握在线工具乔拓云轻松设计在线邀请函&#xff0c;在线一键就能生成活动邀请函和邀请函链接&#xff0c;下面就跟着小编的教学开始学习如何在…