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

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

相关推荐
热点推荐
65岁老头用零食哄骗小女孩,对其侵害长达两年,12岁女孩怀孕产子

65岁老头用零食哄骗小女孩,对其侵害长达两年,12岁女孩怀孕产子

易玄
2026-06-27 01:06:14
扎心!骑士夺冠十周年没请他!湖人最大的噩梦啊!

扎心!骑士夺冠十周年没请他!湖人最大的噩梦啊!

柚子说球
2026-06-28 08:01:46
徐帆回应离婚9个月后,冯小刚再陷争议,养女徐朵成导火索

徐帆回应离婚9个月后,冯小刚再陷争议,养女徐朵成导火索

枯蝶
2026-05-21 22:22:13
韩国在实时算分!韩媒:洪明甫真是走了狗屎运!谢谢救世主西班牙

韩国在实时算分!韩媒:洪明甫真是走了狗屎运!谢谢救世主西班牙

舟望停云
2026-06-27 13:36:19
比独行侠送出东契奇更离谱,球迷:见过蠢的,没见过如此蠢的!

比独行侠送出东契奇更离谱,球迷:见过蠢的,没见过如此蠢的!

奇迹行者在刷野
2026-06-27 10:49:24
小牌大耍?陈赫张子萱阿那亚度假,误入他人镜头却反过来呵斥路人

小牌大耍?陈赫张子萱阿那亚度假,误入他人镜头却反过来呵斥路人

仙味少女心
2026-06-27 18:41:54
解放军唯一一次全军覆没的战斗,阵亡被俘九千人,上万人鸣枪致哀

解放军唯一一次全军覆没的战斗,阵亡被俘九千人,上万人鸣枪致哀

雍亲王府
2026-06-26 20:45:03
随着英格兰2-0、克罗地亚2-1,世界杯最新积分榜出炉

随着英格兰2-0、克罗地亚2-1,世界杯最新积分榜出炉

侧身凌空斩
2026-06-28 07:02:38
斯卡洛尼:梅西将在末轮替补,目标是让球队以同样的方式比赛

斯卡洛尼:梅西将在末轮替补,目标是让球队以同样的方式比赛

懂球帝
2026-06-27 17:30:44
我爸工资2w全部上交我妈,他动手术要60w,我妈扑通一声跪地下了

我爸工资2w全部上交我妈,他动手术要60w,我妈扑通一声跪地下了

黑猫故事所
2026-06-25 20:26:46
韩国队命悬一线 6队抢走名额 出线剩奇迹:最后2组条件需全部满足

韩国队命悬一线 6队抢走名额 出线剩奇迹:最后2组条件需全部满足

我爱英超
2026-06-28 07:08:25
1场1-0,让世界杯K组更乱了,葡萄牙进退两难,C罗这次别无选择

1场1-0,让世界杯K组更乱了,葡萄牙进退两难,C罗这次别无选择

云隐南山
2026-06-27 15:56:37
身高1米3 体重230斤!美国一7岁男童"胖到去世"

身高1米3 体重230斤!美国一7岁男童"胖到去世"

看看新闻Knews
2026-06-27 21:37:48
尴尬!穿光腿神器忘穿裙子;脏内裤挂在腰带外;裙子塞到丝袜里

尴尬!穿光腿神器忘穿裙子;脏内裤挂在腰带外;裙子塞到丝袜里

夜深爱杂谈
2026-06-27 22:06:34
别太悲观!韩国最新出线形势:还剩3组未踢,需2组配合,依旧有戏

别太悲观!韩国最新出线形势:还剩3组未踢,需2组配合,依旧有戏

萌兰聊个球
2026-06-27 13:44:25
太突然了!交叉韧带断裂,躺赚变躺亏5000万...

太突然了!交叉韧带断裂,躺赚变躺亏5000万...

体育新角度
2026-06-27 17:42:03
最新中国癌症数据出炉!Nature综述:中国癌症负担持续攀升,占全球1/4,肺癌新发、死亡双双登顶

最新中国癌症数据出炉!Nature综述:中国癌症负担持续攀升,占全球1/4,肺癌新发、死亡双双登顶

医诺维
2026-06-26 17:32:17
全线涨价20%-30%!氟半导体材料爆发,六大龙头迎来主升浪

全线涨价20%-30%!氟半导体材料爆发,六大龙头迎来主升浪

趣味萌宠的日常
2026-06-27 20:19:39
光速为何是宇宙速度极限?如果光速无限,万物将不复存在!

光速为何是宇宙速度极限?如果光速无限,万物将不复存在!

宇宙时空
2026-06-26 22:00:08
世界杯韩国出线出局五五开,命运彻底交给剩余三场小组赛

世界杯韩国出线出局五五开,命运彻底交给剩余三场小组赛

大汉体育解说
2026-06-27 14:10:28
2026-06-28 08:40:50
ITPUB学院
ITPUB学院
分享技术干货,了解最新动态
1242文章数 629关注度
往期回顾 全部

科技要闻

GPT-5.6发布,你暂时用不了!Mythos也放行

头条要闻

佛得角队长被指正因强奸指控接受调查 事发于今年3月

头条要闻

佛得角队长被指正因强奸指控接受调查 事发于今年3月

体育要闻

世界杯最火门将,站到了阿根廷和梅西面前

娱乐要闻

四提白玉兰终封后,杨紫:仍觉不真实

财经要闻

两只股票撑起的韩国股市,半年熔断 33 次

汽车要闻

搭载华为乾崑ADS 5 全新猛士M817上市售29.99万起

态度原创

数码
房产
亲子
教育
公开课

数码要闻

vivo X Fold6体验: AI交互直觉最对味的折叠大屏!

房产要闻

全国高考大放水,300分就能上本科!论上岸率,海南没输过!

亲子要闻

接图形宝宝回家了,太逗了

教育要闻

4个专业基本“包分配”,还有4个专业未来有“钱途”,高考生注意

公开课

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

无障碍浏览 进入关怀版