看了一些关于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 ,是有可能发生死锁的。
是否是这样的情况? 但是我测试好像没有发生死锁。
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"