首页 数据库 mysql

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


相关推荐