mysql 各种锁归纳总结

news2024/11/16 16:19:10

文章目录

    • 一、引言
    • 二、锁分类
    • 三、Mysql锁
    • 四、MyISAM表锁
    • 五、InnoDB锁
    • 六、间隙锁
    • 七、总结


一、引言

在现代应用程序中,数据库是不可或缺的组成部分之一。而MySQL作为一款开源的关系型数据库管理系统,广泛应用于各种规模的应用中。然而,在高并发的情况下,数据库的性能往往成为瓶颈,因此数据库锁机制成为了至关重要的技术。本文将深入探讨MySQL中的各种锁,包括行锁、表锁、页锁等,以及如何使用它们来提高数据库的性能。

二、锁分类

从对数据操作的粒度来分

表锁:操作时会锁定整个表
行锁:操作时会锁定当前操作行

从对数据操作的类型分

读锁(共享锁):针对同一个份数据,多个读操作可以同时进行而不会互相影响
写锁(排它锁):当前操作没有完成之前,它会阻断其他写锁和读锁

三、Mysql锁

mysql锁的特性

表级锁
偏向MyISAM存储引擎,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低

行级锁
偏向InnoDB存储引擎,开销小,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率最低,并发度最高

页面锁
开锁和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般

在这里插入图片描述

四、MyISAM表锁

MyISAM在执行查询语句(SELECT)前会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用 LOCK TABLE 命令给MyISAM表显式加锁。
显式加锁语法:

lock table table_name read;
lock table table_name write;
unlock tables;

MyISAM表的读操作不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作 MyISAM表的写操作会阻塞其他用户对同一表的读和写操作 MyISAM的读写锁调度是优先写,这也是MyISAM不适合作写为主的表的存储引擎原因。因为写锁后,其他线程不能做任何操作,大量的更新会使查询很难得到锁,从而造成永远阻塞

查看锁争用情况:

show open tables;
show status like 'Table_locks%';

五、InnoDB锁

两种类型的行锁
共享锁(S)
又称读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改

排它锁(X)
又称写锁,简称X锁,排他锁就是不能与其他锁并存,如一个事务获取了一个数据行的排它锁,其他事务就不能再获取改行的其他锁,包括共享锁和排它锁,但是获取排它锁的事务是可以对数据行读取和修改

加锁语句:

select * from table_name whereLOCK IN SHARE MODE
select * from table_name whereFOR UPDATE

TIPS
对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排它锁
对于普通SELECT语句,InnnoDB不会加任何锁

无索引行锁升级为表锁
执行更新时,如果where条件没有索引 或 写法不当导致索引失效(例如:隐式转换),最终行锁变为表锁

-- name 类型为varchar(16)
update test_innodb_lock set sex='2' where name = 400;

六、间隙锁

当我们用范围条件而不是使用相等条件检索数据,并请求共享或排它锁时,InnoDB会给符合条件的已有数据进行加锁;对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)",InnoDB也会对这个”间隙“加锁,这种锁机制就是所谓的间隙锁(Next-Key锁)

图片

update test_innodb_lock set sex = '0' where id < 4;

另一个事务如果执行下面语句时,会被阻塞

insert into test_innodb_lock values(2, '200', '1');

行锁争用情况

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:系统启动后到现在总共等待的次数

七、总结

InnoDB存储引擎由于实现了行级锁定,虽然在锁定机制的实现方面带来了性能损耗可能比表锁会更高一些,但是在整体并发处理能力方面要远远优于MyISAM的表锁的。当系统并发量较高的时候,InnoDB的整体性能和MyISAM相比就会有比较明显的优势
但是,InnoDB的行级锁同样也有其脆弱的一面,当我们使用不当的时候,可能会让InnoDB的整体性能表现不仅不能比MyISAM高,甚至可能会更差

优化建议

尽可能让所有数据检索都能通过索引来完成,避免无索引行锁升级为表锁
合理设计索引,尽量缩小锁的范围
尽可能减少索引条件及索引范围,避免间隙锁
尽量控制事务大小,减少锁定资源量和时间长度
尽可使用低级别事务隔离(需要业务层面满足需求)

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

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

相关文章

如何防止员工删除文件?10个操作让你随时找到重要文件

防止员工删除文件是确保企业数据安全的重要一环&#xff0c;有了这10个操作&#xff0c;让你不愁找不到重要的文件。 1.设置文件访问权限&#xff1a; 在文件服务器上或网络共享中&#xff0c;为不同用户或用户组设置适当的文件访问权限。确保员工只有必要的读、写权限&#…

polyglot,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - polyglot。 Github地址&#xff1a;https://github.com/aboSamoor/polyglot 在处理多语言文本时&#xff0c;解析和翻译不同语言的文本数据是一个常见…

sql注入11、17、24关

sql注入第11关 查看源码后发现注入点。 $sql"SELECT username, password FROM users WHERE username$uname and password$passwd LIMIT 0,1";$resultmysqli_query($con1, $sql);$row mysqli_fetch_array($result, MYSQLI_BOTH); 在User Name输入框中输入注入语句&…

未授权访问漏洞系列详解③!

Elasticsearch未授权访问漏洞 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引…

海运中的甩柜是怎么回事❓怎么才能避免❓

什么是甩柜&#xff1f; 甩柜又叫甩箱&#xff0c;是指集装箱船在起运离港时&#xff0c;船公司没有将此前计划装船的集装箱装运上船&#xff0c;导致部分货物滞留港口。多出现在海运旺季。 为什么会甩柜&#xff1f; 甩箱是集装箱物流中常见的事件&#xff0c;主要因为承运…

LLM大模型技术实战6:一文总结大模型微调方法

大模型会成为AI时代的一项基础设施。作为像水、电一样的基础设施&#xff0c;预训练大模型这样的艰巨任务&#xff0c;只会有少数技术实力强、财力雄厚的公司去做。绝大多数人&#xff0c;是水、电的应用者。对这部分人来说&#xff0c;掌握如何用好大模型的技术&#xff0c;更…

使用GenProtobuf插件生成java实体类

安装插件 配置 Tools 》Configure GenProtobuf 配置本地安装的protoc路径目标语言存放路径 生成Java实体类 在.proto文件上右键 quick gen protobuf rules&#xff0c;会按上面配置的规则执行命令&#xff0c;生成的java文件放到配置指定的文件夹下。 在.proto文件上右键…

正点原子imx6ull-mini-Linux驱动之Linux 多点电容触摸屏实验(24)

触摸屏的使用场合越来越多&#xff0c;从手机、平板到蜂巢取货的屏幕等&#xff0c;到处充斥着触摸屏。触 摸屏也从原来的电阻触摸屏发展到了很流行的电容触摸屏&#xff0c;我们在第二十八章裸机实验中已经 讲解了如何编写电容触摸屏驱动。本章我们就来学习一下如何在 linux 下…

MATLAB代码检查工具PolySpace

概述 PolySpace是MATLAB里面代码静态检查工具。通过检查源代码&#xff0c;可以确定可能在哪里发生潜在的运行时错误&#xff0c;例如算术溢出&#xff0c;缓冲区溢出等等。它最大的特点是可以检查车企常用的MISRA C标准&#xff0c;还免费&#xff0c;就让各大车企爱不释手。…

计算机二级MS office原题分析(40套)

本文档是一份详尽而深入的计算机二级考试原题分析&#xff0c;其内容由我本人亲自整理并精心编纂而成。在整理过程中&#xff0c;我细致研究了历年来的计算机二级考试真题&#xff0c;不仅涵盖了各个模块的经典题型&#xff0c;还深入剖析了题目考察要点以及解题技巧。 同时&a…

打印用“* ”组成的带空格直角三角形图案。

1.//KiKi学习了循环&#xff0c;BoBo老师给他出了一系列打印图案的练习&#xff0c;该任务是打印用“* ”组成的带空格直角三角形图案。 //输入描述&#xff1a; //多组输入&#xff0c;一个整数&#xff08;2~20&#xff09;&#xff0c;表示直角三角形直角边的长度&#xff0…

【日记】这个人居然一个小时就学会了自行车……(2627 字)

正文 每次周末有事&#xff0c;都没时间写。 这周末跑斯那里去&#xff0c;只有一个目的&#xff1a;让他把自行车学会。而这个目的很快就达成了&#xff0c;让人非常意外。连我都没有想到&#xff0c;他居然一个小时就能学会。 周五晚上坐火车过去&#xff0c;他让我直接到超市…

java网络爬虫

前言 单一个项目的功能需要测试的时候&#xff0c;就需要使用大量的假数据做测试&#xff0c;但是这些数据又不能太假&#xff0c;必须合乎常理。于是我们需要爬虫爬取一些网站的一些允许爬取的数据&#xff0c;来做项目功能测试。 一.确认爬取目标 现在爬取下面三个网站的数据…

Java语言程序设计基础篇_编程练习题*16.2 (选择几何图形)

目录 题目&#xff1a;*16.2 (选择几何图形) 习题思路 代码示例 结果展示 题目&#xff1a;*16.2 (选择几何图形) 编写一个绘制各种几何图形的程序&#xff0c;如图16-36b所示。用户从单选按钮中选择一个几何图形 &#xff0c;并且使用复选框指定是否被填充 习题思路 新建…

DDR4的单、双DIE兼容,不做仿真行不行?

高速先生成员--姜杰 地址信号一驱五的DDR4拓扑很常见&#xff0c;可是&#xff0c;一驱五拓扑还要求单DIE、双DIE颗粒兼容的你有见过吗&#xff1f; 案例开讲之前&#xff0c;先简单介绍下DIE&#xff0c;英语学的好的同学都知道这个词的意思不太吉利&#xff0c;不过&#xff…

使用vLLM在一个基座模型上部署多个lora适配器

我们都知道&#xff0c;使用LoRA适配器可以定制大型语言模型(LLM)。并且适配器必须加载在在LLM之上&#xff0c;对于某些应用程序&#xff0c;为用户提供多个适配器可能很有用。例如&#xff0c;一个适配器可以执行函数调用&#xff0c;而另一个适配器可以执行非常不同的任务&a…

SpringBoot+Vue 简单小文章项目开发全过程

文章目录 一、项目介绍二、需求设计三、数据库设计四、项目构建项目技术选型:构建项目说明:项目架构mavenMySQLRedis 五、项目开发&#xff1a;项目开发思路&#xff1a;项目开发过程&#xff1a;1. 导入文件包/新建项目2. 新建子模块&#xff1a;common模块pojo模块server模块…

数据采集与预处理【大数据导论】

各位大佬好 &#xff0c;这里是阿川的博客&#xff0c;祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 数据采集与预处理前 必看 【大数据导论】—大数据序…

Linux 中的特殊文件权限:SUID、GUID 和 Sticky

注&#xff1a; 机翻&#xff0c;未校。 Special File Permissions in Linux: SUID, GUID and Sticky Bit You see an s instead of x in the file permissions? Linux has some special file permissions called SUID, GUID and Sticky Bit. Know more about them. 在文件权…

了解MVCC

概念 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;是一种并发控制的方法&#xff0c;维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现…