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

完蛋,公司被一条 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.

相关推荐
热点推荐
中美俄离婚率:美国2.4‰,俄罗斯高达4.4‰,中国的数据是多少

中美俄离婚率:美国2.4‰,俄罗斯高达4.4‰,中国的数据是多少

影孖看世界
2026-09-17 19:21:58
中国女排2大超新星有望成为世界级球星,成为女排崛起的领军人物

中国女排2大超新星有望成为世界级球星,成为女排崛起的领军人物

张发林
2026-11-05 18:01:03
没有什么比破产时更考验亲情,35岁工厂女老板,风光时经常接济哥嫂,如今负债370万投奔亲哥,门不开电话不接,患难见真情,终究只是少数

没有什么比破产时更考验亲情,35岁工厂女老板,风光时经常接济哥嫂,如今负债370万投奔亲哥,门不开电话不接,患难见真情,终究只是少数

捣蛋窝
2026-11-03 22:10:34
美媒:歼-20牺牲隐身能力,携带16枚导弹,歼20弹舱塞不下的“霹雳-17”导弹,或许能用了

美媒:歼-20牺牲隐身能力,携带16枚导弹,歼20弹舱塞不下的“霹雳-17”导弹,或许能用了

蓝星杂谈
2026-11-05 15:08:07
歌手马天宇晒聊天记录发文:“杨幂已经被删除,接下来是孙怡了”

歌手马天宇晒聊天记录发文:“杨幂已经被删除,接下来是孙怡了”

荒野老五
2026-11-03 11:33:57
沙利文曾向希拉里提议:把台湾“交还”中国,换豁免1.14万亿美债

沙利文曾向希拉里提议:把台湾“交还”中国,换豁免1.14万亿美债

共工之锚
2026-11-05 00:30:27
人不会无故患带状疱疹!研究发现:得带状疱疹的人,离不开这5点

人不会无故患带状疱疹!研究发现:得带状疱疹的人,离不开这5点

垚垚分享健康
2026-11-05 10:38:15
明年上半年:要做好“潮水暴涨”的准备,房价或超乎预料!

明年上半年:要做好“潮水暴涨”的准备,房价或超乎预料!

最美的巧合
2026-11-04 10:07:56
旗袍妈妈盘腿坐小课桌火了,网友一句“坐十分钟腰就酸”把我看破防了

旗袍妈妈盘腿坐小课桌火了,网友一句“坐十分钟腰就酸”把我看破防了

优墨出品
2026-11-04 11:14:38
原来留子在国外是这么看病的!网友:我尿酸高,医生叫我别测了!

原来留子在国外是这么看病的!网友:我尿酸高,医生叫我别测了!

夜深爱杂谈
2026-11-04 20:42:54
1982年国务院13位副总理裁至2人,留下的分别是谁?

1982年国务院13位副总理裁至2人,留下的分别是谁?

观星赏月
2026-11-05 01:07:46
高市早苗以怪异姿势面见天皇引发争议!日本网友:这样一个没出息的人竟是日本首相,真是绝望

高市早苗以怪异姿势面见天皇引发争议!日本网友:这样一个没出息的人竟是日本首相,真是绝望

中国网
2026-11-05 13:23:50
欧洲人都快被中国整崩溃了

欧洲人都快被中国整崩溃了

乌克兰小静
2026-09-15 07:59:44
央视直播11月5日法兰克福冠军赛,梁靖崑对雨果,温瑞博战王楚钦

央视直播11月5日法兰克福冠军赛,梁靖崑对雨果,温瑞博战王楚钦

乒乓球球
2026-11-05 05:36:10
男子和四十多岁女网友认识后,频繁发生关系,最后一次在车内,男子死亡后家属向女子索要巨额赔偿

男子和四十多岁女网友认识后,频繁发生关系,最后一次在车内,男子死亡后家属向女子索要巨额赔偿

丫头舫
2026-10-13 22:10:25
蒋介石麾下 “毒诸葛” 杨永泰,把红军逼上长征路,计策重重施压苏区,才智超群,终究落得悲剧收场

蒋介石麾下 “毒诸葛” 杨永泰,把红军逼上长征路,计策重重施压苏区,才智超群,终究落得悲剧收场

磊子讲史
2026-11-05 19:00:11
网上空姐露着的“黑松露”,不大部分来自同事偷拍!要小心提防!

网上空姐露着的“黑松露”,不大部分来自同事偷拍!要小心提防!

微微热评
2026-11-05 20:20:53
Opta:费内巴切队史欧战第二次单场攻入英格兰球队3球

Opta:费内巴切队史欧战第二次单场攻入英格兰球队3球

懂球帝
2026-11-05 05:01:43
太荒唐了!已婚女子和男网友约会,发生关系后累的睡着,被惊醒后拒绝给男网友钱,女子追悔莫及

太荒唐了!已婚女子和男网友约会,发生关系后累的睡着,被惊醒后拒绝给男网友钱,女子追悔莫及

丫头舫
2026-10-26 15:48:41
轰99+39+21!费城五虎爆发无解,詹皇布朗创神迹,名嘴:东部已是76人的天下

轰99+39+21!费城五虎爆发无解,詹皇布朗创神迹,名嘴:东部已是76人的天下

李喜林篮球绝杀
2026-11-05 12:05:25
2026-11-05 23:31:00
ITPUB学院
ITPUB学院
分享技术干货,了解最新动态
1293文章数 629关注度
往期回顾 全部

科技要闻

一手实测|国产三大Flash模型,谁更能打?

头条要闻

山西女硕士走失13年遭性侵 认亲见父亲靠近骂"老色鬼"

头条要闻

山西女硕士走失13年遭性侵 认亲见父亲靠近骂"老色鬼"

体育要闻

40岁,正是绝杀的年纪!

娱乐要闻

42岁的唐嫣,又上热搜了

财经要闻

伯克希尔,连续3天扫货!

汽车要闻

不是,顶配才16.89万?第二代海豹07这次给得有点多

态度原创

本地
亲子
时尚
游戏
公开课

本地新闻

乌兰察布:以前种土豆,现在种Token

亲子要闻

听完我家4岁娃的科学问题,我怀疑他上辈子是我同行...

冬季的“松弛感”,无需用力

GTAOL抢劫被一脚踢回开头:瞬移、掉线,玩家这口窝囊气该撒了

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版