首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在InnoDB中通过辅助索引删除行时,锁是如何工作的?

在InnoDB中通过辅助索引删除行时,锁是如何工作的?
EN

Database Administration用户
提问于 2015-10-03 10:03:23
回答 1查看 2K关注 0票数 1

step1: InnoDB事务隔离级别

重复阅读。

step2:表模式

代码语言:javascript
复制
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;

step3:准备测试数据

代码语言:javascript
复制
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);

step4:开始两个事务

Session1

代码语言:javascript
复制
session1> begin;
session1> delete from follows where followable_id=28;

Session2

代码语言:javascript
复制
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)
  • 下一个钥匙锁(22,28)
  • 间隙锁(28,32)

()()的涵义

  • ():间隙锁是索引记录之间的间隙锁,我使用括号()来表示。
  • (]下一个键锁是索引记录上的记录锁和索引记录之前的间隙锁的组合。我用(代表)它。

如果手册是正确的,结果应该是(22,28)。因此,我对测试结果与MySQL手册之间的冲突感到非常困惑:

  1. 如何解释冲突?
  2. 你能解释一下DELETE FROM ... WHERE ... sets an exclusive next-key lock on every record the search encounters.的含义吗?
EN

回答 1

Database Administration用户

发布于 2015-10-24 00:22:52

(半相关的评论.)

假设这是一个标准的多到多映射表,完全摆脱id。然后将另一个KEYs (任意一个)设置为PRIMARY KEY。更多提示这里

如果DELETE是典型的,那么我将使KEYfollowable_id开始为PRIMARY KEY

这将加快插入和删除,从而避免死锁和“锁等待”。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/116882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档