mysql下键锁定规则?

时间:2019-10-14 10:38:34

标签: mysql sql

这是mysql下一键锁定问题。我有一个表“ 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. 在会话1中,我打开事务并执行“从gaptest中删除var1 = 10;”
  2. 在session2中,我打开事务,首先执行“插入gaptest select 9,20;”,它被阻止。当我执行“插入gaptest选择29,20;”它没有被阻止。

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

1 个答案:

答案 0 :(得分:0)

在会话1中,有如下所示的下一键锁定:

df
     ID Possible_Size Actual_Size             Big
0  1234           BIG         BIG   True Positive
1  5678        MEDIUM         BIG  False Negative
2  9876           BIG       SMALL  False Positive
3  1092        MEDIUM      MEDIUM                

对于(20,9),它属于最后一个范围,因此将被阻止。 对于(20,29),它不在范围内,因此不会被阻止。

您需要考虑-- format by (var1, id) ((5, 1), (10, 5)] ((10, 5), (10, 30)] ((10,30), (20, 10)] var1的范围。因此,对于id,小于{10的var1=20将被阻止,而大于{10的id将不会被阻塞。