程序员MySQL的for update锁细节不注意 就容易发生生产悲剧
程序员、MySQL、锁、并发、编程
吐槽
业务代码经常用for update锁来防并发
但有些细节不注意
然后会发生死锁等等悲剧情况
本文章是经过亲自实验得出的结论
具体实验
mysql版本 5.7.17-log

初始数据

例1: (明确指定主键或唯一索引,若查无此数据,lock表影响新增)
- select * from table where 是唯一索引但无数据 for udpate

另一个窗口执行新增操作,发生阻塞

但是执行更新操作和行锁,尽然不阻塞

例2: (明确指定主键或唯一索引,并且查出数据,row lock)

另一个窗口能正常插入新数据

但另窗口执行相同for update会阻塞

例3: (无索引情况,table lock 非常可怕哦)
注意commit先不执行哦

插入新数据进入阻塞状态

更新其他数据行业是阻塞状态,看来是真表锁了

实验总结
- 如果要用for udpate切记要是唯一索引
- 有唯一索引for update查不到数据情况,影响新增但不影响更新
- for update字段是普通字段时,Innodb会锁住整张表(容易发生悲剧)
相关推荐
-
MySQL 安装失败,提示Apply Security Settings 的处理办法
MySQL 安装失败,提示Apply Security Settings 的处理办法2025-04-20 01:54:57 -
MySQL事务隔离级别详解2025-04-20 01:44:01
-
一文说清nginx规则匹配(含案例分析)2025-04-20 01:10:02
-
运维服务篇:Nginx常用功能(rewrite重定向/location定位等)
运维服务篇:Nginx常用功能(rewrite重定向/location定位等)2025-04-20 00:55:25 -
php定义变量规则不能包含哪些字符?2025-04-20 00:27:24