网易首页 > 网易号 > 正文 申请入驻

MySQL强人“锁”难《死磕MySQL系列 三》

0
分享至

系列文章

一、原来一条select语句在MySQL是这样执行的《死磕MySQL系列 一》

二、一生挚友redo log、binlog《死磕MySQL系列 二》

前言

最近数据库老是出现下面死锁情况,借着这俩种情况出发详细的理解一下MySQL中的锁。

Lock wait timeout exceeded; try restarting transaction

Deadlock found when trying to get lock; try restarting transaction

一、MySQL中有那些锁

全局锁

根据全局两个字,就可以肯定的是给一个整体加上锁。全局锁就是对整个数据库实例加锁。

对于flush tables with read lock,执行完成后整库就处于只读状态,所有语句将被堵塞,包括增删改查、创建表、修改表结构等语句。

表锁

表锁大家都非常熟悉了,执行命令直到之前,其它线程是无法对kaka写kaka2读的。

lock tables kaka read ,kaka2 write

unlock tables

执行命令的这个线程也只可以对kaka读,kaka2写。

行锁

行锁是在引擎层由各个引擎自己实现的。在MySQL中Innodb存储引擎支持行锁,若不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一个更新在执行,这就会影响到业务并发度。(由于篇幅的原因,下期细谈)

二、全局锁

演示执行命令后数据库处于什么状态。

flush tables with read lock

终端1执行全局锁命令

端口2执行删除操作,它不会直接执行成功,而是在端口1解锁后返回。

这个SQL需要3分钟的执行时间,这3分钟就是咔咔打开终端2并连接数据库的时间。

现在见证了开篇所说的全局锁直接让整个库处于只读状态,这里只演示了删除操作其它的几个操作自己尝试一下。

在蒋老师的文章中看到全局锁最典型的场景是用于逻辑备份,即是将整个库的每一个表都select存储成文本。

现在,你想想这种场景是在什么需要下出现的。

假如只有一个主库,执行了全局锁整库处于只读状态,那么业务基本停摆,产品无法使用。

此时你会有疑问我在从库上备份啊!备份期间,不能执行主库同步过来的binlog的,数据量如果非常大,将引发主从延迟过大,必须进行全量备份。

以上是全局锁引发的负面情况,但再看备份不加全局锁会出现什么问题。

相信大多数小伙伴都开发过支付类项目,接下来就用支付案例让大家很清晰的理解备份不加全局锁引发的问题。

发起一个逻辑备份。如果一个用户在备份期间购买了你公司的服务,在业务逻辑先扣除用户余额,然后给用户添加你公司对应的产品。

显然,这个逻辑没有问题的,但在特殊案例下执行备份操作就会引发问题。

若在时间顺序上先备份用户余额,然后用户发起购买,接着备份用户购买的产品表。

一个非常清晰的问题出现了,用户余额没减成功但用户却获得了对应的产品。

从用户的角度出发那是赚大发了,但这种执行顺序如果反过来的话就会产生不一样的结果。

先备份用户产品表,然后备份用户余额表,就会出现用户钱花了东西没得着,这还得了,用户都是衣食父母这不是再割父母的韭菜。

也就是说,在备份不加锁的话,不同表之间的执行备份的顺序不同,如果某个表在备份的过程中进行了更新并且成功备份而关联的表已经备份完成无法再进行跟新,此时就会出现数据不一致。

在MVCC那篇文章中提到了一个非常重要的概念一致性视图(read view),一致性视图是根据快照读所有未提交事务的集合,前提是隔离级别为可重复。

那一刻

这时你应该知道要说什么了,没错就是官方大大给提供的逻辑备份工具mysqldump。

mysqldump的备份原理是通过协议连接到 MySQL 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。

例如备份test库的命令为。

mysqldump -uroot -p test > /backup/mysqldump/test.db

当mysqldump使用参数--single-transaction时,备份数据之前会启动一个事物,拿到一致性视图(read view),所以在整个备份的过程中是支持更新的。

既然有了官方大大提供的mysqldump工具为何还要使用来将整表锁住呢?

flush tables with read lock

别忘记了刚提到的可以在备份过程中进行更新,可以更新的前提是可以得到一致性视图,获取一致性视图的前提是开启事务。这里你应该清楚,不是所有存储引擎都支持事物。

如果有的表使用了别的存储引擎不支持事物,那么就只能使用方法,说到这里希望大家尽量在创建表时都选择Innodb存储引擎。

flush tables with read lock

看着好一会了,还能记得咱们要干什么吗?需求是全库处于只读状态。

如果你搭建过MySQL的主从架构,就会知道主库用来写数据,从库用来读数据并且从库不支持写入操作,可以实现这样的效果都是来自于参数readonly。

同样执行也可以达到整库只读状态,那么为什么从一开始没有给大家说这个方案,那是有原因的。

set global readonly=true

一是,刚刚提到的搭建主从架构需要使用readonly来判断主库与从库。

二是,在异常处理的方式不同。如果使用命令客户端异常后MySQL会自动释放全局锁,让整个库回到正常状态。而整库设置为readonly后,一旦发生异常就会一直处于只读状态,导致整库长时间处于不可写状态。

flush talbes with read lock

所以说数据库一旦加上全局锁后数据的增删改、修改表结构、修改字段等操作都会被锁住。

三、表锁

表锁跟全局锁释放的命令一致,同样客户端断开的时候也会自动释放。

unlock tables

在老一辈的革命前辈处理并发都是用的表锁,应该都知道锁表的影响虽不及锁库影响大,但在今天锁的粒度已经支持到行锁了(前提是使用Innodb存储引擎,就没必要再使用行锁来处理并发了。

再来看表锁中的另一位哥们“元数据锁”(metalock)简称“MDL”,这个锁估计很少人知道,因为在实际开发过程中是不会有实际的语法来开启或关闭。

这个特性是在MySQL5.5版本后引入的,就是为了解决A线程正在查询一个表的数据,在这期间B线程修改了表的数据结构,那么就会造成查询的结果跟表结构对不上,这肯定是不行的。

当你访问一个表时会默认加上MDL写锁,不管在任何时候记住读锁与读锁之间不互斥,读锁与写锁,写锁与写锁之间互斥,知道行锁的共享锁、排它锁也是这么个理。

那么MDL 不需要显示调用,那它是在什么时候释放的?

回答是:“MDL 是在事务提交后才会释放,这意味着事务执行期间,MDL 是一直持有的。”

那么看一个场景。

首先,线程A开启事务并执行查询语句时,对表加上了MDL锁。

然后,线程B执行的是查询,并不会堵塞住,因为读与读并不冲突。

接着,线程C修改表结构,此时的线程A还未提交事务,MDL还未释放,这时的线程因无法获取到MDl写锁,就会被阻塞。

最后线程D执行查询会发生什么呢?

答案是堵塞。

到这里按照正常的逻辑,线程C没有获取到MDL的写锁,线程D是可以申请到MDL读锁的,那为什么还会堵塞呢!

这是因为申请MDL锁的操作会形成一个队列,队列中写锁获取优先级高于读锁,一旦出现MDL写锁等待,会。

阻塞后续该表的所有CURL操作

到这里你有没有后背发凉,一旦你在一个未提交事务之后执行了DDL操作,那么等到的结果就是MySQL挂掉,客户端会有重试机制,DDL后所有CURD会在超时后重新发起请求,这个库的线程会很快爆满。

既然这样如何给表安全的执行DDL操作呢?

首先,必须解决到长事务,事务不提交MDL锁就无法释放。

然后,在MySQL系统表里找到infomation_schema库中的innodb_trx,可以查看当前正在执行中的事务ID,这个表在事务那期文章中也没少提。

接着,你是不是想kill掉这些长事务然后执行DDL不就得了。

试想一下,当你kill掉的下一刻一个新的事务又进来了,同时你又执行了DDL操作,后果是什么应该清楚了哈!这种操作肯定是不行的。

官方大大怎么会允许这种情况发生呢!

于是当你执行DDL操作时可以加一个等待时间,如果在这个等待时间拿到MDL写锁最好,拿不到也不能堵塞后边的业务逻辑,先放弃。再重试执行这个命令。

alter table kaka wait 30 add name

四、总结

坚持学习、坚持写作、坚持分享是咔咔从业以来所秉持的信念。愿文章在偌大的互联网上能给你带来一点帮助,我是咔咔,下期见。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
11月16日俄乌最新:泽连斯基对“和平”的最新表态

11月16日俄乌最新:泽连斯基对“和平”的最新表态

西楼饮月
2024-11-16 21:13:34
安徽舒城县政府大院“随便进”引热议,县长:大家都是群众,没有不方便

安徽舒城县政府大院“随便进”引热议,县长:大家都是群众,没有不方便

澎湃新闻
2024-11-17 07:32:26
越南卡拉ok账单上出现“叫鸡”的收费项目,网友大呼,这称谓真敢整

越南卡拉ok账单上出现“叫鸡”的收费项目,网友大呼,这称谓真敢整

越南语学习平台
2024-11-16 09:00:05
谁买了俄罗斯的苏57?从网友给出买家的可能性排名中,就这2家

谁买了俄罗斯的苏57?从网友给出买家的可能性排名中,就这2家

大风文字
2024-11-16 13:43:05
杨议郭德纲事件再起波澜!德云社针对杨议猛烈反击,好戏要上演!

杨议郭德纲事件再起波澜!德云社针对杨议猛烈反击,好戏要上演!

娱乐的小灶
2024-11-17 09:10:27
赚了钱该追梦了?西班牙天才维加计划重返五大联赛 多家劲旅有意

赚了钱该追梦了?西班牙天才维加计划重返五大联赛 多家劲旅有意

智道足球
2024-11-17 07:58:27
韦东奕“包浆老年机”火出圈,一年上百万工资,活得清贫纯属任性

韦东奕“包浆老年机”火出圈,一年上百万工资,活得清贫纯属任性

熙熙说教
2024-11-14 18:08:45
心脏决定寿命!建议中老年人别太节俭,常吃6种食物,越吃越年轻

心脏决定寿命!建议中老年人别太节俭,常吃6种食物,越吃越年轻

多思味
2024-11-14 19:33:36
五代机飞行速度对比:F35最快2.2马赫,苏57最快2.12马赫,歼20呢

五代机飞行速度对比:F35最快2.2马赫,苏57最快2.12马赫,歼20呢

明月历史说
2024-11-15 18:25:24
年轻草根无黑人!快80的特朗普领一帮80后执政,3大特点看点多

年轻草根无黑人!快80的特朗普领一帮80后执政,3大特点看点多

大风文字
2024-11-16 18:48:39
江苏某地曾收缴 20 万比特币现值175亿美元!美国或推战略比特币储备

江苏某地曾收缴 20 万比特币现值175亿美元!美国或推战略比特币储备

新浪财经
2024-11-16 13:42:07
人民币汇率大幅升值,11月17日,今日凌晨的四大消息全面发酵!

人民币汇率大幅升值,11月17日,今日凌晨的四大消息全面发酵!

风口招财猪
2024-11-17 00:55:03
大s酸了!汪小菲带马筱梅购物,一件衣服让具俊晔望而却步,太难

大s酸了!汪小菲带马筱梅购物,一件衣服让具俊晔望而却步,太难

花花lo先森
2024-11-17 09:23:53
征集民企内部腐败线索,实属乱作为!

征集民企内部腐败线索,实属乱作为!

梦马笔谈
2024-11-16 19:40:35
A股:股民注意,大变盘来了!满仓和空仓的都慌了!明天要这样走

A股:股民注意,大变盘来了!满仓和空仓的都慌了!明天要这样走

云姐财说
2024-11-17 09:33:08
金融市场,又乱套了

金融市场,又乱套了

米筐投资
2024-11-17 07:04:11
杨紫“带套试戏”后续:已取证,男方被爆承认,牵连多位女星

杨紫“带套试戏”后续:已取证,男方被爆承认,牵连多位女星

阿凫爱吐槽
2024-11-14 16:57:31
霍建华被曝精神异常!常喝酒帮美女买单,林心如默认婚变称难相处

霍建华被曝精神异常!常喝酒帮美女买单,林心如默认婚变称难相处

扒星人
2024-11-15 23:40:27
巩俐咋变成这样了!这还是当年那个在内娱叱咤风云的“巩皇”吗

巩俐咋变成这样了!这还是当年那个在内娱叱咤风云的“巩皇”吗

时髦范
2024-10-06 09:09:15
奚梦瑶晒女儿生日礼物,六身衣服全是迪奥,3岁就收到香奈儿包包

奚梦瑶晒女儿生日礼物,六身衣服全是迪奥,3岁就收到香奈儿包包

缘浅娱深
2024-11-16 11:13:28
2024-11-17 12:52:49
原来是咔咔丫
原来是咔咔丫
你为技术,技术为你
22文章数 48关注度
往期回顾 全部

科技要闻

马斯克新官上任再起诉OpenAI!指控其垄断

头条要闻

牛弹琴:中美元首历史性会晤 拜登表态发生微妙变化

头条要闻

牛弹琴:中美元首历史性会晤 拜登表态发生微妙变化

体育要闻

历史第二!哈登之于三分时代,又算什么?

娱乐要闻

金鸡奖:李庚希影后,赵丽颖美神下凡

财经要闻

央行化债,是“换水” 而不是“放水”

汽车要闻

全新燃油MINI正式上市 20.88-30.58万元

态度原创

教育
艺术
时尚
健康
旅游

教育要闻

中国大学生3人篮球赛上海静安公园举行 促商旅文体展联动

艺术要闻

故宫珍藏的墨迹《十七帖》,比拓本更精良,这才是地道的魏晋写法

女人过了50岁秋季怎么穿?拒绝老气、注重简约高级,气质更优雅

花18万治疗阿尔茨海默病,值不值?

旅游要闻

陕西华山景区、太白山景区迎来降雪

无障碍浏览 进入关怀版