程序员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会锁住整张表(容易发生悲剧)