MySQL45讲 -- MYSQL中的锁

根据加锁的范围,MySQL里面的锁大致可以分成全局锁表级锁行锁三类

全局锁

使用FTWRL命令
该锁让整个库处于只读状态的时候,可以使用这个命令,之后数据库的更新事务会被阻塞
使用场景:全库逻辑备份
FTWRL与readOnly的区别
如果执行FTWRL命令之后由于客户端发生异常断开,那么MySQL会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为readonly之后,如果客户端发生异常,则数据库就会一直保持readonly状态,这样会导致整个库长时间处于不可写状态,风险较高。

表级锁

MySQL里面表级别的锁有两种:一种是表锁,一种是元数据锁

表锁

表锁的语法是 lock tables …read/write。可以用unlock tables主动释放锁,也可以在客户端断开的时候自动释放。需要注意,lock tables语法除了会限制别的线程的读写外,也限定了本线程接下来的操作对象

元数据锁

另一类表级的锁是MDL(metadata lock)。MDL不需要显式使用,在访问一个表的时候会被
自动加上。MDL的作用是,保证读写的正确性。你可以想象一下,如果一个查询正在遍历一个
表中的数据,而执行期间另一个线程对这个表结构做变更,删了一列,那么查询线程拿到的结果
跟表结构对不上,肯定是不行的。
当对一个表做增删改查操作的时候,加MDL读锁;当要对表做结构变更操作的时候,加MDL写锁

读锁之间不互斥,因此你可以有多个线程同时对一张表增删改查。
读写锁之间、写锁之间是互斥的,用来保证变更表结构操作的安全性。
如何正确使用MDL写锁
在alter table语句里面设定等待时间,如果在这个指定的等待时间里面能够拿到MDL写锁最好,拿不到也不要阻塞后
面的业务语句,先放弃

行锁

行锁就是针对数据表中行记录的锁
在InnoDB事务中,行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放(一个事务可能会执行多条SQL语句)

死锁和死锁检测

死锁时,有两个策略
一种策略是,直接进入等待,直到超时。这个超时时间可以通过参数innodb_lock_wait_timeout来设置。
另一种策略是,发起死锁检测,发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数innodb_deadlock_detect设置为on,表示开启这个逻辑。
**怎么解决由这种热点行更新导致的性能问题呢?**问题的症结在于,死锁检测要耗费大量的CPU资源。
1.如果你能确保这个业务一定不会出现死锁,可以临时把死锁检测关掉。但是这种操作本身带有一定的风险,因为业务设计的时候一般不会把死锁当做一个严重错误,毕竟出现死锁了,就回滚,然后通过业务重试一般就没问题了
2.控制并发度。根据上面的分析,你会发现如果并发能够控制住,比如同一行同时最多只有10个线程在更新,那么死锁检测的成本很低,就不会出现这个问题,但是,你会很快发现这个方法不太可行,因为客户端很多。
3.考虑通过将一行改成逻辑上的多行来减少锁冲突,是以影院账户为例,可以考虑放在多条记录上,比如10个记录,影院的账户总额等于这10个记录的值的总和。这样每次要给影院账户加金额的时候,随机选其中一条记录来加。这样每次冲突概率变成原来的1/10,可以减少锁等待个数,也就减少了死锁检测的CPU消耗。
这个方案看上去是无损的,但其实这类方案需要根据业务逻辑做详细设计。如果账户余额可能会减少,比如退票逻辑,那么这时候就需要考虑当一部分行记录变成0的时候,代码要有特殊处理。
相关问题:
如果你要删除一个表里面的前10000行数据,有以下三种方法可以做到:
第一种,直接执行delete fromTlimit 10000;
第二种,在一个连接中循环执行20次 delete fromTlimit 500;
第三种,在20个连接中同时执行delete fromTlimit 500。
你会选择哪一种方法呢?为什么呢?

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

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

相关文章

详解SpringCloud微服务技术栈:ElasticSearch实践2——RestClient查询并处理文档

👨‍🎓作者简介:一位大四、研0学生,正在努力准备大四暑假的实习 🌌上期文章:详解SpringCloud微服务技术栈:ElasticSearch搜索结果处理(排序、分页、高亮) 📚订…

VMware 虚拟机环境下的ubuntu 上安装mysql,并能远程访问数据库

需求:为了实现在linux上模拟服务器跑代码,并存储在mysql上,通过远程可视化mysql数据库软件查看linux上mysql数据库数据的实时动态。 1. 虚拟机和ubuntu的安装 这里我选择的是VMware workstation-v14, ubuntu-18.04.1。至于体流程网上很多&a…

VUE中一些概念的理解

Vue 中 computed、mounted 和 methods 的基本理解。 computed 计算属性 (computed):主要用于根据现有的响应式数据(即 data 中的数据或其他 computed 属性)进行计算并返回一个新的值。计算属性是基于它们的响应式依赖进行缓存的。只有当依赖…

vite项目配置本地开发使用https访问,3分钟搞定

在开发过程中,有时候需要用到一些音视频接口等需要https才能拿到权限,为方便开发过程中调试,这里就介绍几种vite项目快速开启https访问的方式。vite配置项说明文档:开发服务器选项 | Vite 官方中文文档 第一种:使用插件…

api管理工具的新发现

一、之前用过的api管理工具 关于api管理工具,之前用过yapi和postman,但是后来发现了这两个工具 二、新发现的更强大的:Apifox和Eolink Apifox和Eolink,那这两个工具有什么优势呢? 2.1Apifox 其中 Apifox Postman …

Xlua分析:Lua调用C#

在之前的博客Lua与C#交互初析-CSDN博客中讲了有关lua和c#交互的比较浅层的概念,即C#侧注册[LuaCallCSharp]和[CSharpCallLua]的标签后,即可实现双侧沟通。但是还是没有讲明白里面的一些具体内容包括参数传递、xlua栈调用,甚至是C#如何调用lua…

SpringBoot引入 liteflow 规则引擎,yyds!

1前言 在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。 在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这…

R语言【taxlist】——levels():获取或设置分类等级列表

Package taxlist version 0.2.4 Description 分类层次结构可以设置为 taxlist 对象中的级别,按从低到高的顺序排列。 在 taxlist 对象中为特定分类概念添加分类级别。此外,概念限制的变化可能涉及其分类层次结构的变化。 Usage levels(x)## S3 method…

五、C#与数据库交互(数据绑定与数据视图控件)

在C#中,与数据库进行交互是常见的任务,尤其是在.NET环境中。你可以使用ADO.NET,Entity Framework或Dapper等框架来实现与数据库的交互。以下是一个简单的例子,展示如何使用ADO.NET来从数据库中获取数据并绑定到Windows Forms应用程…

python基础3

7.5 range range 可以生成数字供 for 循环遍历 , 它可以传递三个参数,分别表示 起始、结束和步长。 8. 数据类型高级 8.1 字符串高级 字符串的常见操作包括: 获取长度 :len len 函数可以获取字符串的长度。 查找内容 :find 查找指定内容在字符…

Compose | UI组件(五) | Button 按钮组件

文章目录 前言Button 是什么?Button的创建Button显示水平方向的UI IconButton是什么?IconButton是创建 FloatingActionButton是什么?FloatingActionButton创建 ExtendedFloatingActionButton是什么? 总结 前言 随着移动端的技术不…

java—AWT

AWT 课程:1、GUI编程简介_哔哩哔哩_bilibili 一.介绍 包含了很多类和接口!GUI!元素:窗口、按钮、文本框java.awt 二.窗口 1.构造 2.方法 // 实例化frame类Frame frame new Frame("这个一个框");// 设置可见性frame.…

Metaphor(EXA) 基于大语言模型的搜索引擎

文章目录 关于 Metaphor使用示例 关于 Metaphor Metaphor是基于大语言模型的搜索引擎,允许用户使用完整的句子和自然语言搜索,还可以模拟人们在互联网上分享和谈论链接的方式进行查询内容。 Metaphor同时还能与LLMs结合使用,允许LLMs连接互联…

帧头不对齐的频段间载波聚合(interCA-NonAlignedFrame)

提升上下行吞吐量是3GPP演进的重要方向之一,其中,载波聚合是提升吞吐量最有效的手段之一。在3GPP R16中,帧头不对齐的频段间载波聚合被提出,可以进一步提升上行吞吐量。 帧头对齐的频段间载波聚合 帧头对其的频段间载波聚合&…

第十三届蓝桥杯省赛C/C++,JAVA,Python研究生组题 质因数个数

4658. 质因数个数 - AcWing题库 给定正整数 n,请问有多少个质数是 n 的约数。 输入格式 输入的第一行包含一个整数 n。 输出格式 输出一个整数,表示 n 的质数约数个数。 数据范围 对于 30%30% 的评测用例,1≤n≤10000 对于 60%60% 的评测用例…

(c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度

适用情况: ①题目中出现最短,最长 ②出现子串、子数组、子数列 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求&am…

编曲学习:和声音程 调式体系 唱名法 调式调性

34届和声音程 调式体系 唱名法 调式调性https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65af994be4b064a8cb1c3a5f?course_idcourse_2XLKtQnQx9GrQHac7OPmHD9tqbv 34届独立音乐人编曲训练营https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_p…

开源项目提交pr的方式

在开源项目中提交PR(Pull Request)是一种常见的贡献方式,它允许开发者向项目仓库提交代码更改并请求合并到主分支中。以下是提交PR的一般步骤: Fork仓库:首先,你需要Fork(即复制)你想…

鸿蒙开发-UI-组件

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 鸿蒙开发-UI-布局-弹性布局 鸿蒙开发-UI-布局-相对布局 鸿蒙开发-UI-布局-格栅布局 鸿蒙开发-UI-布局-列表 ​​​​​​鸿蒙开发-UI-布局-网格 鸿蒙开发-UI-布局-轮播 文章目录 前言 一、按钮 1.创建…

深度强化学习(王树森)笔记04

深度强化学习(DRL) 本文是学习笔记,如有侵权,请联系删除。本文在ChatGPT辅助下完成。 参考链接 Deep Reinforcement Learning官方链接:https://github.com/wangshusen/DRL 源代码链接:https://github.c…