• 测试技术
  • 博客
  • 视频
  • 开源
  • 论坛
  • 沙龙
  • 下载
  • 杂志
  • 招聘

字号: | 推荐给好友 上一篇 | 下一篇

巧用MySQL InnoDB引擎锁机制解决死锁问题

发布: 2008-4-25 10:03 | 作者: buyan | 来源: 希赛网 | 查看: 31次 | 进入领测软件测试网论坛讨论

领测软件测试网 索引:KEY_TSKTASK_MONTIME2 (STATUS_ID, MON_TIME)。软件测试技术门户3|#E}u9U

%G(e0JS!u0?1J  分析,涉及的两条语句应该不会涉及相同的TSK_TASK记录,那为什么会造成死锁呢?软件测试技术门户 _yC+K3|C)s

E$go1J ~Phnm)[  查询MySQL官网文档,发现这跟MySQL的索引机制有关。MySQL的InnoDB引擎是行级锁,我原来的理解是直接对记录进行锁定,实际上并不是这样的。软件测试技术门户yt FU ~e%\3X

_*FY!Y1I  要点如下:软件测试技术门户 py(u:V`6B!V5O/a3t

,c'V"ZW ?  不是对记录进行锁定,而是对索引进行锁定;

`6J#B5svD 软件测试技术门户S_Hh.?c4i

  在UPDATE、DELETE操作时,MySQL不仅锁定WHERE条件扫描过的所有索引记录,而且会锁定相邻的键值,即所谓的next-key locking;软件测试技术门户)~^Y-\[&V

软件测试技术门户-d ^sk`vf]%a

  如语句UPDATE TSK_TASK SET UPDATE_TIME = NOW() WHERE ID > 10000会锁定所有主键大于等于1000的所有记录,在该语句完成之前,你就不能对主键等于10000的记录进行操作;

$G6N"_Im5HGl!X$S I 软件测试技术门户Fx]\a3]1d Io

  当非簇索引(non-cluster index)记录被锁定时,相关的簇索引(cluster index)记录也需要被锁定才能完成相应的操作。

3RX"r"mmp 软件测试技术门户B$\R$XU){

  再分析一下发生问题的两条SQL语句,就不难找到问题所在了:软件测试技术门户6ENK'k_/o4BE5V6_

软件测试技术门户o~ h1~(I`AM

  当“update TSK_TASK set STATUS_ID=1064,UPDATE_TIME=now () where STATUS_ID=1061 and MON_TIME

n$U9uOqf H5` 软件测试技术门户r!k$}q