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

完蛋,公司被一条 update 语句干趴了!

0
分享至

昨晚在群划水的时候,看到有人说了这么一件事。


大概就是,在线上执行一条 update 语句修改数据库数据的时候,where 条件没有带上索引,导致业务直接崩了,被老板教训了一波

这次我们就来看看:

  • 为什么会发生这种的事故?

  • 又该如何避免这种事故的发生?

说个前提,接下来说的案例都是基于 InnoDB 存储引擎,且事务的隔离级别是可重复读。

1

为什么会发生这种的事故?

InnoDB 存储引擎的默认事务隔离级别是「可重复读」,但是在这个隔离级别下,在多个事务并发的时候,会出现幻读的问题,所谓的幻读是指在同一事务下,连续执行两次同样的查询语句,第二次的查询语句可能会返回之前不存在的行。

因此 InnoDB 存储引擎自己实现了行锁,通过 next-key 锁(记录锁和间隙锁的组合)来锁住记录本身和记录之间的“间隙”,防止其他事务在这个记录之间插入新的记录,从而避免了幻读现象。

当我们执行 update 语句时,实际上是会对记录加独占锁(X 锁)的,如果其他事务对持有独占锁的记录进行修改时是会被阻塞的。另外,这个锁并不是执行完 update 语句就会释放的,而是会等事务结束时才会释放。

在 InnoDB 事务中,对记录加锁带基本单位是 next-key 锁,但是会因为一些条件会退化成间隙锁,或者记录锁。加锁的位置准确的说,锁是加在索引上的而非行上。

比如,在 update 语句的 where 条件使用了唯一索引,那么 next-key 锁会退化成记录锁,也就是只会给一行记录加锁。

这里举个例子,这里有一张数据库表,其中 id 为主键索引。


假设有两个事务的执行顺序如下:


可以看到,事务 A 的 update 语句中 where 是等值查询,并且 id 是唯一索引,所以只会对 id = 1 这条记录加锁,因此,事务 B 的更新操作并不会阻塞。

但是,在 update 语句的 where 条件没有使用索引,就会全表扫描,于是就会对所有记录加上 next-key 锁(记录锁 + 间隙锁),相当于把整个表锁住了

假设有两个事务的执行顺序如下:


可以看到,这次事务 B 的 update 语句被阻塞了。

这是因为事务 A的 update 语句中 where 条件没有索引列,所有记录都会被加锁,也就是这条 update 语句产生了 4 个记录锁和 5 个间隙锁,相当于锁住了全表。


因此,当在数据量非常大的数据库表执行 update 语句时,如果没有使用索引,就会给全表的加上 next-key 锁, 那么锁就会持续很长一段时间,直到事务结束。

而这期间除了select ... from语句,其他语句都会被锁住不能执行,业务会因此停滞,接下来等着你的,就是老板的挨骂。

那 update 语句的 where 带上索引就能避免全表记录加锁了吗?

并不是。

关键还得看这条语句在执行过程中,优化器最终选择的是索引扫描,还是全表扫描,如果走了全表扫描,就会对全表的记录加锁了

2

又该如何避免这种事故的发生?

我们可以将 MySQL 里的sql_safe_updates参数设置为 1,开启安全更新模式。

官方的解释:
If set to 1, MySQL aborts UPDATE or DELETE statements that do not use a key in the WHERE clause or a LIMIT clause. (Specifically, UPDATE statements must have a WHERE clause that uses a key or a LIMIT clause, or both. DELETE statements must have both.) This makes it possible to catch UPDATE or DELETE statements where keys are not used properly and that would probably change or delete a large number of rows. The default value is 0.

大致的意思是,当 sql_safe_updates 设置为 1 时。

update 语句必须满足如下条件之一才能执行成功:

  • 使用 where,并且 where 条件中必须有索引列;

  • 使用 limit;

  • 同时使用 where 和 limit,此时 where 条件中可以没有索引列;

delete 语句必须满足如下条件之一才能执行成功:

  • 使用 where,并且 where 条件中必须有索引列;

  • 同时使用 where 和 limit,此时 where 条件中可以没有索引列;

如果 where 条件带上了索引列,但是优化器最终扫描选择的是全表,而不是索引的话,我们可以使用force index([index_name])可以告诉优化器使用哪个索引,以此避免有几率锁全表带来的隐患。

3

总结

不要小看一条 update 语句,在生产机上使用不当可能会导致业务停滞,甚至崩溃。

当我们要执行 update 语句的时候,确保 where 条件中带上了索引列,并且在测试机确认该语句是否走的是索引扫描,防止因为扫描全表,而对表中的所有记录加上锁。

我们可以打开 MySQL 里的 sql_safe_updates 参数,这样可以预防 update 操作时 where 条件没有带上索引列。

如果发现即使在 where 条件中带上了列索引列,优化器走的还是全标扫描,这时我们就要使用force index([index_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.

相关推荐
热点推荐
重磅:乌克兰摧毁莫斯科南部关键的谢尔普霍夫军火库!

重磅:乌克兰摧毁莫斯科南部关键的谢尔普霍夫军火库!

项鹏飞
2026-10-22 19:47:42
泽连斯基不是懦夫,不会割地25%投降!

泽连斯基不是懦夫,不会割地25%投降!

山河路口
2026-10-22 20:13:17
意外!辽宁铁人三大离队热门浮出水面,徐正源为此会引进嫡系补强

意外!辽宁铁人三大离队热门浮出水面,徐正源为此会引进嫡系补强

懂个球
2026-10-23 02:47:21
豆瓣9.2分,这部王牌美剧不愧是收视第一

豆瓣9.2分,这部王牌美剧不愧是收视第一

天天美剧吧
2026-10-23 16:52:26
空调用电明显减少,1-9月居民用电10年来首现负增长

空调用电明显减少,1-9月居民用电10年来首现负增长

第一财经资讯
2026-10-22 13:08:52
朱芳雨观战!广东男篮终于赢球,赛后三人被表扬,徐杰可以离队了

朱芳雨观战!广东男篮终于赢球,赛后三人被表扬,徐杰可以离队了

南海浪花
2026-10-23 03:11:02
一上市公司董事长,车祸离世!

一上市公司董事长,车祸离世!

黄河新闻网吕梁
2026-10-23 09:40:04
武汉一女子报警称“8根金条被盗”,民警上门在抽屉夹缝中悉数找到

武汉一女子报警称“8根金条被盗”,民警上门在抽屉夹缝中悉数找到

极目新闻
2026-10-23 12:48:31
下午3点半!CCTV5直播中超夺冠焦点战,超4万球迷齐聚凤凰山,大连英博盼逆袭

下午3点半!CCTV5直播中超夺冠焦点战,超4万球迷齐聚凤凰山,大连英博盼逆袭

篮球圈里的那些事
2026-10-22 19:55:37
辽宁一对夫妇凑7万送女儿出国留学,之后21年未见面,临走前才知女儿已经结婚,还成了德国教授...

辽宁一对夫妇凑7万送女儿出国留学,之后21年未见面,临走前才知女儿已经结婚,还成了德国教授...

背包旅行
2026-10-22 12:40:08
三秀才之一的关锋,出狱后是什么待遇,晚年生活是怎样的呢

三秀才之一的关锋,出狱后是什么待遇,晚年生活是怎样的呢

贱议你读史
2026-10-22 17:29:26
乌克兰之所以落到今天这步田地,罪魁祸首不是北约,不是欧盟

乌克兰之所以落到今天这步田地,罪魁祸首不是北约,不是欧盟

西楼知趣杂谈
2026-09-13 21:45:49
沿用21年征信老规矩要作废!负债人、普通人利好来了!

沿用21年征信老规矩要作废!负债人、普通人利好来了!

时尚的弄潮
2026-10-21 11:20:49
正式官宣,WTT公布重要人事任命,中国乒乓美女被提拔,正式上岗担任总监职务

正式官宣,WTT公布重要人事任命,中国乒乓美女被提拔,正式上岗担任总监职务

青色雨音r
2026-10-22 13:40:39
秘书长选举6轮无果,中方看好的人也被否,不料杀出一人半路截胡

秘书长选举6轮无果,中方看好的人也被否,不料杀出一人半路截胡

轩逸阿II
2026-10-23 17:59:47
别等失去了才后悔。 厦门小伙暗恋高一班主任多年,大学毕业后果断追娶回家,祝有情人终成眷属

别等失去了才后悔。 厦门小伙暗恋高一班主任多年,大学毕业后果断追娶回家,祝有情人终成眷属

捣蛋窝
2026-10-03 09:50:51
炸裂!日本妻子拍AV挽救婚姻,瞒夫出道老公崩溃,如今丈夫成粉丝

炸裂!日本妻子拍AV挽救婚姻,瞒夫出道老公崩溃,如今丈夫成粉丝

悠悠说世界
2026-08-17 13:48:27
女人过了50岁,除你丈夫,别的男人靠近你,说白了就一个目的

女人过了50岁,除你丈夫,别的男人靠近你,说白了就一个目的

娱乐洞察点点
2026-10-23 16:53:28
女子入住韩国济州岛民宿,意外在床缝捡到中国同胞遗失的手机,辗转联系上失主,引发网友热议

女子入住韩国济州岛民宿,意外在床缝捡到中国同胞遗失的手机,辗转联系上失主,引发网友热议

环球网资讯
2026-10-23 18:23:23
牵动两岸目光!蒋家 27 人投票 14 比 13 敲定迁葬事宜,蒋友松出资择定溪口摩诃坡,蒋万安受访,仅表示尊重家族长辈的想法!

牵动两岸目光!蒋家 27 人投票 14 比 13 敲定迁葬事宜,蒋友松出资择定溪口摩诃坡,蒋万安受访,仅表示尊重家族长辈的想法!

唠叨说历史
2026-10-23 14:23:07
2026-10-23 19:24:49
ITPUB学院
ITPUB学院
分享技术干货,了解最新动态
1286文章数 629关注度
往期回顾 全部

科技要闻

抢运营商饭碗!马斯克又有大动作

头条要闻

李昌钰告别会举办 夫人泪别:你等我18年 我也跟你合葬

头条要闻

李昌钰告别会举办 夫人泪别:你等我18年 我也跟你合葬

体育要闻

没人看好的加图索,打出队史最佳开局

娱乐要闻

黎纪君晒与刘恺威合照 恋情后首次同框

财经要闻

叫"保障"不叫"保险":租车平台的文字游戏

汽车要闻

全球首款增程越野皮卡 长安猎手K70上市19.29万元起

态度原创

教育
手机
时尚
游戏
本地

教育要闻

2027年高考日语八大提分策略!人教版新教材改革后必看!

手机要闻

一加Ace 7/Pro手机三款配色公布,10月29日发布

衬衫专场|| 入秋以来最爱穿这件,怎么搭都好美

三角洲行动账号购买全流程指南及靠谱平台推荐

本地新闻

这么近,那么美,周末赴贺州丨大湾区后花园

无障碍浏览 进入关怀版