【锁住精华】MySQL锁机制全攻略:从行锁到表锁,共享锁到排他锁,悲观锁到乐观锁

news2024/9/28 2:57:19

MySQL有哪些锁

1、按照锁的粒度划分

行锁

是最低粒度的的锁,锁住指定行的数据,加锁的开销较大,加锁较慢,可能会出现死锁的情况,锁的竞争度会较低,并发度相对较高。但是如果where条件里的字段没有加索引,则加的行锁会自动升级为表锁,因为行锁是基于索引去进行操作的,所以想要加行锁,就一定要在条件字段为索引的基础上进行操作。

表锁

锁住指定的表,粒度较大,但是加锁的开销小,加锁快,不会出现死锁,且锁的竞争度会较为激烈,并发度比行锁要低很多。

全局锁

粒度最大的锁,会锁住整个库,所有的表都不能进行更新插入操作,只能读。

全局锁命令如下:

flush tables with read lock;

页锁(仅了解即可,几乎用不到)

是仅在BDB(Blackhole黑洞)引擎上所支持的一种锁。页锁就是在数据页上,以页为维度进行锁定的,一页里面会有多行数据。页锁的开销是介于行锁和表锁之间的,并发度一般。

2、按照互斥性划分

共享锁(读锁)

一个事务给某行数据加上共享锁之后,其他事务就不能再加拍排他锁,但是可以加共享锁。因为读操作不会去改变数据信息,所以可以允许多个事务去共享同一个共享锁,并行去读取数据,而不会互相影响。

排他锁(写锁)

一个事务给某行数据加上排他锁之后,其他事务就不能再给这行数据加任何锁,即不允许写,也不允许读。所以排他锁可以确保在同一时刻,一个被加上锁的资源只会有一个事务去进行更新操作,有效避免了多个事务同时对一条数据进行修改,导致最终出现数据不一致问题。

3、按照性能划分

注意:乐观锁、悲观锁、意向锁都不是mysql里实际上真正的锁,而是由开发人员定义出来区分两种类型锁的设计思想。

悲观锁(PCC)

悲观锁(Pessimistic Concurrency Control)的思想是,持有一种很悲观消极的态度,默认为在数据资源被外部访问时,一定会出现冲突,所以在一个线程在数据处理的过程中都会持有锁资源,保证在同一时刻,只有一个线程可以访问到这个数据,具有排他性。

一般悲观锁都是直接使用mysql数据库的行锁和表锁去实现。

乐观锁(OCC)

乐观锁(Optimistic Concurrency Control)的思想是,持有一种乐观的态度,认为即使是在并发的场景下,对于数据资源的访问,也不会出现冲突,所以不会去加锁,而是在数据进行提交更新操作的时候,才会去判断此次提交是否存在冲突,如果冲突了,便在代码逻辑层面去处理冲突之后的处理方案,是直接结束本次更新操作,还是重新再去尝试更新。

例如

user表有数据id为1,balance余额为10。

现在想实现在并发的场景下,去修改余额(线程A请求,需要扣减余额3,线程B请求,需要扣减余额9),需要避免出现余额为负数。

实现方案,给user表加一个版本号字段version,每次更新数据时,数据更新行的version版本号要加1,且在执行更新操作的时候,where条件里需要带上版本号。

操作流程

请添加图片描述

详细过程解析

线程A和线程B同时获取到用户的余额为10,数据版本为1。

然后线程A先执行了更新操作,将用户的余额改成了7(线程A要扣减余额3),数据版本也变成了2。

紧接着线程B也来执行更新操作了,但是因为线程B查询用户余额时,线程A还没有更新数据,所以线程B要将用户的余额改成1(线程B要扣减余额9)。

但是在更新时,因为线程B拿到的数据版本是1,而此时的数据版本已经成为了2,所以线程B的更新操作失败了。

此时线程B接收到更新操作失败的结果后,可以选择直接抛出异常给用户,或者重新查询用户余额之后,再去尝试扣减余额操作。

意向锁(仅了解即可)

意向锁可简单理解为在操作行锁时,在表上添加了一个标识,表明这个表已经存在了共享锁或排他锁,其他事务在想加锁时,只需要到表上判断下这个标识就知道自己能否继续往下获取到锁。

深入了解可看文章 《 深度解读MySQL意向锁的工作原理机制与应用场景 》

间隙锁(Gap-Lock)

间隙锁是InnoDB在可重复读的隔离级别下,为了解决幻读而引入的一种锁机制。

间隙锁只会在数据表的隔离级别为可重复读隔离级别下才能生效。

是在索引记录之间的间隙上加的一个锁,是锁定了一个数据区间,比如一数据表的字段a数据为[1, 2, 5, 9],如果sql如下

select * from tablename where a = 3 for update;

,则加的间隙锁就是[2, 5],间隙的范围是根据检索条件向下寻找最靠近检索条件的记录值A,用于作为左区间,向上寻找最靠近检索条件的记录值B,用于作为右区间,即锁定的间隙为(A,B)。加上了间隙锁,则[2, 5]区间的数据都不能再进行操作,直到锁释放。

4、加锁方式

查询语句加共享锁

# 如果id有索引,则是加的行级共享锁,如果id没有索引,则加的是表级共享锁
select * from tablename where id = 'xxxx' lock in share mode;

查询语句加排他锁

# 如果id有索引,则是加的行级排他锁,如果id没有索引,则加的是表级排他锁
select * from tablename where id = 'xxxx' for update

在操作delete、update、insert语句时,数据库会自动加上排他锁(如果条件有索引,则是加的行级锁,如果条件没有索引,则加的是表级锁)。

请添加图片描述

关注我,我将持续输出Java常用相关技术文章。

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

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

相关文章

【中级通信工程师】终端与业务(十):通信市场营销组合策略

【零基础3天通关中级通信工程师】 终端与业务(十):通信市场营销组合策略 本文是中级通信工程师考试《终端与业务》科目第十章《通信市场营销组合策略》的复习资料和真题汇总。本章的核心内容涵盖了市场营销组合策略的特点、产品策略、价格策略、渠道策略和促销策略…

2206. 将数组划分成相等数对(排序/哈希)

目录 一:题目: 二:代码: 三:结果: 一:题目: 给你一个整数数组 nums ,它包含 2 * n 个整数。 你需要将 nums 划分成 n 个数对,满足: 每个元素…

【开源项目】数字孪生智慧停车场——开源工程及源码

飞渡科技数字孪生停车场管理平台,基于国产数字孪生3D渲染引擎,结合数字孪生、物联网IOT,以及车牌自动识别、视频停车诱导等技术,实现停车场的自动化、可视化和无人化值守管理。 以3D可视化技术为基础,通过三维场景完整…

【原创】java+swing+mysql企业招聘管理系统设计与实现

个人主页:程序员杨工 个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验 博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片,希望和大家…

2024年9月第4周AI资讯

阅读时间:3-4min 更新时间:2024.9.23-2024.9.27 目录 o1 处于OpenAI的AGI5阶段的第2阶段 微软使用核燃料推动AI发展 阿里巴巴和英伟达在自动驾驶方向合作 Meta 推出 AR xAI 眼镜、新型号 o1 处于OpenAI的AGI5阶段的第2阶段 概要 OpenAI 首席执行官 …

怎么查看网站是否被谷歌收录,哪些因素影响着网站是否被谷歌收录

一、怎么查看网站是否被谷歌收录 查看网站是否被谷歌收录,有多种方法可供选择,以下是几种常用的方式: 1.使用“site:”指令: 在谷歌搜索引擎的搜索框中输入“site:你的域名网址”(注意使用英文冒号&#x…

【GUI设计】基于Matlab的图像去噪GUI系统(8),matlab实现

博主简介: 如需获取设计的完整源代码或者有matlab图像代码项目需求/合作,可联系主页个人简介提供的联系方式或者文末的二维码。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像去噪GUI系统&am…

CUDA error: no kernel image is available for execution on the device

记录一下出现上述问题的一个原因: pytorch所依赖的cuda版本不满足显卡(GPU)的算力要求! 举例来说,显卡是3090,并按照以下命令安装Pytorch: conda install pytorch1.7.0 torchvision0.8.0 torchaudio0.7.0 cudatoolkit10.1 -c p…

STM32转AT32代码转换

1. 引言 在嵌入式开发中,我们经常会遇到更换单片机芯片的事情,若芯片是同一厂家的还好说,若是不同厂家的则需要重新写,重新调,重新去学习其底层驱动程序,比较费时费力。如:ST32转AT32、ST32转G…

数论——数数(找质因数个数),三位出题人(组合数学,快速幂)

数数&#xff08;找质因数个数&#xff09; 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码&#xff08;通过率一半&#xff09; #include <iostream> #include <vector> using namespace std; const int N5e66; int n; vector<bool>vis; vo…

自定义认证过滤器和自定义授权过滤器

目录 通过数据库动态加载用户信息 具体实现步骤 一.创建数据库 二.编写secutity配置类 三.编写controller 四.编写服务类实现UserDetailsService接口类 五.debug springboot启动类 认证过滤器 SpringSecurity内置认证流程 自定义认证流程 第一步:自定义一个类继承Abstra…

AFSim仿真系统 --- 系统简解_01(任务模块)

任务 任务是AFSIM的基线可执行文件。通过任务&#xff0c;用户可以访问世界仿真框架&#xff08;WSF&#xff09;。该可执行文件&#xff08;mission.exe&#xff09;解释文本格式的仿真输入文件&#xff08;场景&#xff09;&#xff0c;以生成仿真&#xff0c;并可选择以多种…

c语言中的杨氏矩阵的介绍以及元素查找的方法

杨氏矩阵&#xff1a;是一个二维数组 特点&#xff1a;数组的每行从左到右都是递增的 数组的每列从上到下都是递增的 这种矩阵结构使得在查找特定元素时&#xff0c;可以利用其 递增性质来缩小范围&#xff0c;提高查找效率。 从杨氏矩阵中对元素进行查找 1&#xff0c;要求…

沟通技巧对班组长的工作效率有什么影响?

在企业管理的细微脉络中&#xff0c;班组长作为基层管理的中坚力量&#xff0c;其工作效率直接影响着整个生产线的流畅度与团队士气。而沟通技巧&#xff0c;作为人际交往的桥梁&#xff0c;不仅在日常交流中扮演着重要角色&#xff0c;更在班组管理中发挥着不可替代的作用。本…

Bigemap Pro首发(一款真正全面替代Arcgis的国产基础软件)

Bigemap Pro是一款功能强大的计算机数据要素辅助设计(Computer-Aided Data Elements Design CADED)软件&#xff0c;由成都比格图数据处理有限公司研发设计&#xff0c;主要应用在数据要素设计领域&#xff0c;为各行业提供安全可靠高效易用的数据要素设计类国产化基础软件。Bi…

2024年汉字小达人区级自由报名倒数4天:最新问题和今年比赛方式和题型解析

今天是2024年第十一届汉字小达人的区级自由报名活动的第三天&#xff0c;也是倒数第四天。 今天是星期五&#xff0c;通常孩子们放学会早一点。接下来是周六有一整天的时间可用&#xff0c;周日、周一又要上课了&#xff0c;所以实际上可用的较多的备考时间就是今天晚上和明天…

华为OD机试 - 西天取经 - 广度优先搜索BFS(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

windows上设置某exe开机自启动。亲测有效

亲测有效方法 1。通过文件夹启动 0。先创建exe的快捷方式 1。 winR 2。输入shell::startup 3.将exe的快捷方式复制或拖动到打开的文件夹 通过启动文件夹 创建您的EXE文件的快捷方式。 打开文件资源管理器&#xff0c;导航到 C:\Users\YourUsername\AppData\Roaming\Microsoft\…

CORE MVC 过滤器 (筛选器)

MVC FrameWork MVCFramework MVC Core 过滤器 分 同步、异步 1、 授权筛选器 IAuthorizationFilter&#xff0c;IAsyncAuthorizationFilter 管道中运行的第一类筛选器&#xff0c;用来确定发出请求的用户是否有权限发出当前请求 2、资源筛选器 IResourceFilter &#xff0c;…

操作系统 概论

1. 操作系统★ 1.1. 定义 操作系统(Operating System,简称OS)是一种计算机系统软件(计算机软件可以分为系统软件、支撑软件和应用软件三类),他管理和控制计算机硬件和软件资源,并合理地组织调度计算机工作和资源分配,以提供给用户和其他软件方便的接口和环境。 1.2. …