В MySQL 5.7 InnoDB REPEATABLE READ
Поскольку COL1 имеет не-unque-индекс,
select * from t where COL1 = 13 for update;
Оператор блокирует запись кластерного индекса B + Tree, где id = 4, также блокируетиндекс COL1 B + Tree, где запись имеет COL1 = 10, и блокирует индекс COL1 B + Tree от (k = 11, id = 3) до (k = 20, id = 5) с блокировкой пробела.
insert into t (COL1) values(10); equals to : insert into t (id, COL1) values(6,10); gap lock
insert into t (COL1) values(11); equals to : insert into t (id, COL1) values(7,11); gap lock
insert into t (COL1) values(12); equals to : insert into t (id, COL1) values(8,12); gap lock
insert into t (COL1) values(19); gap lock
insert into t (COL1) values(20); equals to : insert into t (id, COL1) values(9,20);
Но посмотрите это условие:
CREATE TABLE `t` (
`id` int(11) NOT NULL,
`k` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_k` (`k`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8<br>
insert into t values(2,2),(6,6);
, затем вставьте:
1, insert into t values (1,2); success
2, insert into t values (3,2); block
3, insert into t values (5,6); block
4, insert into t values (7,6); success
, если они все могут вставить, где эти значения расположены в дереве k'B +?
, чтобы вы могли видеть, что (k = 2, id = 1) можно вставить, поскольку оно не в промежутке, также значение (k = 6, id = 7), (k = 2, id = 3) и (k = 6, id = 5) невозможно вставить, потому что они находятся в промежутке.