《MySql学习》 行锁对业务的影响

news2024/9/29 1:17:59

一. 行锁介绍

行锁由各个存储引擎分别实现,MyISAM存储引擎是不支持行锁的,这也是MySQL使用InnoDB作为默认存储引擎的一个重要原因,锁更细的InnoDB能支持更多的并发业务。但需要注意的是,行锁在InnoDB的实现是给索引加的锁,而不是记录。因此 使用update语句时,where条件后的字段需要建立索引,否则将使用的是表锁,因为没有索引让InnoDB去加上这个行锁,只有给整张表加上锁

二. 两阶段锁协议

行锁在需要的时候加上,但不是会立即释放,如果处在一个事务中,只有当事务提交后行锁才会释放,这就是两阶段锁协议

img

如上事务B在执行的时候会被阻塞,因为事务A在同一时刻还未提交事务,行锁依然存在。只有当事务A提价后,事务B才能继续执行。

基于以上结论,如果在一个事务中,对于使用到行锁的SQL语句,我们应该尽量放到事务最后执行,减少对其他也需要用到同一行锁的事务的影响

三. 死锁检测与锁超时机制

由于行锁是具有互斥性的,那么 当两个事务互相持有对方需要的锁资源且一直不释放自身持有的锁资源时,将造成死锁,如下图所示,此时将造成死锁。

img

当出现死锁的时候,MySQL有两种机制去处理

锁超时机制

InnoDB有默认的锁超时时间,一般为50秒,可以通过执行以下SQL进行查询,当出现死锁以后,第一个被锁住的线程要过 50s 才会超时退出,然后其他线程才有可能继续执行。对于在线服务来说,这个等待时间往往是无法接受的。但是,我们又不可能直接把这个时间设置成一个很小的值,比如 1s。这样当出现死锁的时候,确实很快就可以解开,但如果不是死锁,而是简单的锁等待呢?所以,超时时间设置太短的话,会出现很多误伤。

show variables like 'in1nodb_lock_wait_timeout'

image-20230216131012842

死锁检测

参数 innodb_deadlock_detect 的值为 on时,则表示当前启用了死锁检测。当开启时,InnoDB发现死锁后,会主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。但死锁检测需要消耗大量的CPU资源去主动检测。

每个新来的被堵住的线程,都要判断会不会由于自己的加入导致了死锁,这是一个时间复杂度是 O(n) 的操作。假设有 1000 个并发线程要同时更新同一行,那么死锁检测操作就是 100 万这个量级的。虽然最终检测的结果是没有死锁,但是这期间要消耗大量的 CPU 资源。因此,你就会看到 CPU 利用率很高,但是每秒却执行不了几个事务。

show variables like 'innodb_deadlock_detect'

image-20230216131327734

四.热点数据更新导致的性能问题如何解决

产生原因

由于死锁检测要耗费大量的 CPU 资源,导致性能低下

尝试关闭死锁检测

如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。但是这种操作本身带有一定的风险,因为业务设计的时候一般不会把死锁当做一个严重错误,毕竟出现死锁了,就回滚,然后通过业务重试一般就没问题了,这是业务无损的。而关掉死锁检测意味着可能会出现大量的超时,这是业务有损的。

控制并发数量,不关闭死锁检测

如果并发能够控制住,比如同一行同时最多只有 10 个线程在更新,那么死锁检测的成本很低,就不会出现这个问题。例如我们可以将对一行的修改改成对多行的修改,比如一行记录记录着总金额,我们可以将一行记录拆分成多行,总金额等于多行记录之和,从而降低了锁冲突的概率。但这种修改需要对代码也做出对应的改变。类似于JAVA中的LongAdder类,将对一个值的CAS改成对数组中每个组员的CAS,提高并发效率

另外,最近重温操作系统时发现了一个免费精品好课,闪客的《Linux0.11源码趣读》,这个课给我感觉像在用看小说的心态学操作系统源码,写的确实挺牛的,通俗易懂,直指本源,我自己也跟着收获了很多。这个课在极客时间上是免费的,口碑很不错,看评论下很多人在催更和重温,强烈推荐!戳此链接领取:

https://time.geekbang.org/opencourse/intro/100310101?utm_source=linux_dk&utm_term=linux_dk

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

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

相关文章

智慧养殖无线通讯解决方案

一、方案概述农植畜禽/水产养殖智能监控系统可以在远端设备实现对如温度、湿度、气体浓度、光照度等传感设备的自动调节与控制功能。管理者可随时通过电脑了解养殖场各环节的运行状况,并根据养殖现场内外环境因子的变化情况将命令下发到现场执行设备。为动植物营造舒…

docker-compose安装SonarQube

前言SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码, 潜在bug, 代码规范,安全性漏洞等问题, 并通过SonarQube web UI展示出来。一、docker-compose配置#v…

【Python】编写代码实现指定下标值顺序进行正序和倒序排序算法编程

🎉🎉 在本次python文章中,主要通过定义一个排序方法,实现一组数列能够按照另一组数列指定的位置进行重新排序输出,默认正序排序,可通过True表示逆序输出 目录1、知识点2、数列和元组1)错误遍历方…

全网多种方式解决Knife4j文档请求异常

文章目录1. 复现问题2. 分析问题3. 解决问题4. 其他方法解决此异常5. 其他说明1. 复现问题 今天在本地启动项目后,刷新Knife4j接口文档,却报出如下错误: 即Knife4j文档请求异常。 2. 分析问题 报出Knife4j文档请求异常错误时,赶…

生活不一定很酷,但是一定要全力以赴

题记:努力是为了让自己不平庸 当看到这个话题“竞赛那些事”,我还是有所触动的,我本身就是一个不喜欢安逸,喜欢折腾的人,纵使不能把日子过成诗,也要折腾成向往的样子。 我的记忆在脑海中不停翻着页&#x…

黑马redis学习记录:分布式锁

一、基本原理和实现方式对比 分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁,只要大家使用的是同一把锁,那么我们就能锁住线程,不让线程进行,让程序串行…

Linux_基本权限

Linux入门第二篇已送达! Linux_基本权限shell外壳权限Linux的用户分类角色划分Linux的文件文件类型查看权限目录的权限默认权限粘滞位shell外壳 为了保护操作系统,用户的指令不能由操作系统直接进行执行,需要一个中间者,比如Linu…

MySQL优化篇-MySQL压力测试

备注:测试数据库版本为MySQL 8.0 MySQL压力测试概述 为什么压力测试很重要?因为压力测试是唯一方便有效的、可以学习系统在给定的工作负载下会发生什么的方法。压力测试可以观察系统在不同压力下的行为,评估系统的容量,掌握哪些是重要的变化…

基于ThinkPHP6.0+Vue+uni-app的多商户商城系统好用吗?

likeshop多商户商城系统适用于B2B2C、多商户、商家入驻、平台商城场景。完美契合平台自营联营加盟等多种经营方式使用,系统拥有丰富的营销玩法,强大的分销能力,支持官方旗舰店,商家入驻,平台抽佣商家独立结算&#xff…

重生之我是赏金猎人-SRC漏洞挖掘(八)-记一次移花接木的GetShell

0x00:前言 https://github.com/J0o1ey/BountyHunterInChina 欢迎亲们点个star 作者:RGM78sec 某天测厂商业务时,发现其中有一个提供音乐播放业务的资产,正好里面有我想听的歌,于是就有了这篇文章 0x01:…

天翼云服务器如何限制端口仅限部分ip地址访问

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 前言 最近买了个服务器,没错,是天翼云的。 客户没有钱,买大厂的太贵舍不得,那就买个普通的吧,经媒人介绍,觉得天翼…

vue小案例

vue小案例 组件化编码流程 1.拆分静态组件,按功能点拆分 2.实现动态组件 3.实现交互 文章目录vue小案例组件化编码流程1.父组件给子组件传值2.通过APP组件给子组件传值。3.案例实现4.项目小细节1.父组件给子组件传值 父组件给子组件传值 1.在父组件中写好要传的值&a…

5min完成linux环境Jenkins的安装

5min搞定linux环境Jenkins的安装安装Jenkinsstep1: 使用wget 命令下载Jenkinsstep2、创建Jenkins日志目录并运行jekinsstep3、访问jenkins并解锁jenkins,安装插件以及创建管理员用户step4、到此,就完成了Finish、以上步骤中遇到的问题1、 jenkins启动不了…

Python爬虫(5)-selenium用显式等待、隐式等待、强制等待,解决反复爬取网页时无法定位元素问题

之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Python爬虫(2)-Selenium控制浏览…

MybatisPlus实现分页效果并解决can‘t found IPage for args!错误

前言 早就知道MybatisPlus对分页进行了处理,但是一直没有实战用过,用的是自己封装的一个分页组件,虽不说麻烦吧,但是也不是特别简单。 写起来还是比较复杂,但是最近这个组件有了点小小的bug,我决定是时候…

公网连接内网工具推荐(还在为局域网联机发愁?)

一、FastNat可为您解决的问题1.没有公网服务器,需要发布本地的站点或网络程序到公网上,供他人访问;此项功能大大方面开发人员进行远程调试,微信小程序等开发工作进行。2.需要远程到在其他网络中的设备,但两处的网络不通…

安装ENVI Py for ArcGIS

目录 软件版本 配置环境 在cmd命令行中输入 启动ArcGIS Pro,点击Start with another template。 在刚才的路径中找到文件ENVIPyManagement.aptx,点击OK。 软件版本 ArcGIS Pro 3.0.2 ENVI 5.6 其他版本请参考官方帮助文档,方法类似。 …

五、HTML之表单

文章目录一、表单的作用1.1 常用控件1.2 宽高自适应1.3 窗口自适应1.4 伪元素选择器1.5 浮动高度塌陷问题1.6 左侧一栏为200px余下的右边栏占余下屏幕一、表单的作用 表单用来收集用户的信息。 语法&#xff1a; <form action "提交地址" method"提交方法…

3.3 ISIS引入路由

实验目的掌握IS-IS引入直连路由的方法掌握IS-IS引入静态路由的方法实验拓扑IS-IS引入路由的实验拓扑如图3-2所示: 图3-2:IS-IS引入路由 实验步骤IP地址的配置R1的配置 <Huawei>system-view [Huawei]undo info-center enable

【实战场景一】设计一个分布式环境下全局唯一的信号器

前面&#xff0c;我们罗列了一些面试时可能会到的一些技术上的问题。但都是基于理论&#xff0c;也就是外面所说的八股文。应付一些基础的或者中级的开发岗位来说&#xff0c;是没什么问题的&#xff0c;但如果想拿高薪&#xff0c;或者升职的话&#xff0c;仅靠八股文是仅仅不…