mysql INNODB update语句加锁顺序

看了一些关于mysql INNODB 加锁的分析。 如果修改了主键信息,会加主键索引锁和所有非聚簇索引锁,修改 了非聚簇索引列值会加该种非聚簇索引锁,然后加主键索引锁。

加入有个表

CREATE TABLE `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20)  NOT NULL,
  `descs` varchar(30)  DEFAULT NULL,
  `extra` varchar(30)  DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`),
  KEY `descs` (`descs`)
) 
INSERT INTO `test`(`id`,`name`,`descs`,`extra`) VALUES ( 1,'ll','3','2'); 

以下2个sql 如果同时执行,是不是应该会发生死锁。

UPDATE test SET descs="dd" WHERE id =  1

加锁顺序 先获取 主键索引锁 然后 获取 name索引锁。

UPDATE test SET descs="dd" WHERE name =  "ll"

加锁顺序 先获取 name索引锁 然后 或许 主键索引锁

这样理论上,不同事物分别执行上面的sql ,是有可能发生死锁的。

是否是这样的情况? 但是我测试好像没有发生死锁。

阅读 14.4k
1 个回答
新手上路,请多包涵

id已经是聚簇索引,where里只带id的话应该只锁id这个索引。
而name是非聚簇索引,mysql应该是先锁对应name索引,然后再锁id索引。

这样写应该会死锁:
UPDATE test SET descs="dd" WHERE id = 1 and name='ll';
UPDATE test SET descs="dd" WHERE name = "ll"

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏