【问题标题】:Rule of mysql next-key lock?mysql next-key lock的规则?
【发布时间】:2020-02-10 23:22:34
【问题描述】:

这是一个mysql next-key lock问题。我有一个表'gaptest',它的语句是

DROP TABLE IF EXISTS `gaptest`;
CREATE TABLE `gaptest` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `var1` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `var1` (`var1`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb4;

-- ----------------------------
-- Records of gaptest
-- ----------------------------
INSERT INTO `gaptest` VALUES ('1', '5');
INSERT INTO `gaptest` VALUES ('5', '10');
INSERT INTO `gaptest` VALUES ('30', '10');
INSERT INTO `gaptest` VALUES ('10', '20');
INSERT INTO `gaptest` VALUES ('15', '30');
INSERT INTO `gaptest` VALUES ('20', '40');
INSERT INTO `gaptest` VALUES ('40', '55');
INSERT INTO `gaptest` VALUES ('25', '60');

这就是我所做的

  1. 在 session1 中,我打开事务并执行“DELETE FROM gaptest WHERE var1 = 10;”
  2. 在 session2 中我打开事务,首先执行“insert into gaptest select 9,20;”,它被阻塞了。当我执行“插入gaptest select 29,20;”时它没有被阻止。

为什么第一个语句被阻塞而第二个没有?

【问题讨论】:

  • 您好,我尝试了您的示例并且没有阻塞...也许您有一些待处理的操作?禁用自动提交?

标签: mysql sql


【解决方案1】:

在会话 1 中,有如下的下一个键锁:

-- format by (var1, id)
((5, 1), (10, 5)]
((10, 5), (10, 30)]
((10,30), (20, 10)]

对于(20, 9),它属于最后一个范围,所以会被阻塞。 对于(20, 29),超出范围,不会被屏蔽。

您需要考虑var1id 的范围。所以,var1=20,小于 10 的id 会被屏蔽,大于 10 的id 不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2019-08-15
    • 2016-12-28
    • 2011-11-14
    • 1970-01-01
    • 2011-08-18
    相关资源
    最近更新 更多