重复阅读。
CREATE TABLE `follows` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`followable_type` varchar(255) DEFAULT NULL,
`followable_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `type_first` (`followable_type`,`followable_id`),
KEY `id_first` (`followable_id`,`followable_type`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;insert into follows(followable_type, followable_id) values ("Post", 6);
insert into follows(followable_type, followable_id) values ("Post", 22);
insert into follows(followable_type, followable_id) values ("Post", 28);
insert into follows(followable_type, followable_id) values ("Post", 32);
insert into follows(followable_type, followable_id) values ("Post", 34);session1> begin;
session1> delete from follows where followable_id=28;session2> begin;
session2> insert into follows(followable_type, followable_id) value ("Post", 22);
Lock wait timeout exceeded; try restarting transaction
session2>insert into follows(followable_type, followable_id) value ("Post", 28);
Lock wait timeout exceeded; try restarting transaction
session2>insert into follows(followable_type, followable_id) value ("Post", 32);
Query OK, 1 row affected (0.01 sec)MySQL手工索赔
DELETE FROM ... WHERE ...为搜索遇到的每一条记录设置一个独占的下键锁。
https://dev.mysql.com/doc/refman/5.0/en/innodb-locks-set.html
实际上,session1锁定了这个范围[22,32],其中包括
()()的涵义
如果手册是正确的,结果应该是(22,28)。因此,我对测试结果与MySQL手册之间的冲突感到非常困惑:
DELETE FROM ... WHERE ... sets an exclusive next-key lock on every record the search encounters.的含义吗?发布于 2015-10-24 00:22:52
(半相关的评论.)
假设这是一个标准的多到多映射表,完全摆脱id。然后将另一个KEYs (任意一个)设置为PRIMARY KEY。更多提示这里
如果DELETE是典型的,那么我将使KEY从followable_id开始为PRIMARY KEY。
这将加快插入和删除,从而避免死锁和“锁等待”。
https://dba.stackexchange.com/questions/116882
复制相似问题