Я столкнулся с проблемой блокировки innodb для транзакций в таблице с первичным ключом и отдельным уникальным индексом.Похоже, если TX удалит запись, используя уникальный ключ, а затем повторно вставит эту же запись, это приведет к блокировке следующего ключа вместо ожидаемой блокировки записи (поскольку ключ уникален).Ниже приведен тестовый пример, а также разбивка записей, которые, как я ожидаю, будут иметь какие блокировки:
DROP TABLE IF EXISTS foo;
CREATE TABLE `foo` (
`i` INT(11) NOT NULL,
`j` INT(11) DEFAULT NULL,
PRIMARY KEY (`i`),
UNIQUE KEY `jk` (`j`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
INSERT INTO foo VALUES (5,5), (8,8), (11,11);
(Примечание. Просто запустите TX2 sql после TX1 sql в отдельном соединении)
TX1
START TRANSACTION;
DELETE FROM foo WHERE i=8;
приводит к исключительной блокировке для i = 8 (без блокировки пробела, поскольку i является первичным ключом и уникальным)
INSERT INTO foo VALUES(8,8);
приводит к исключительной блокировке для i = 8& j = 8, и совместно используемая блокировка намерения для i = 6 & i = 7, а также j = 6 & j = 7
TX2
START TRANSACTION;
INSERT INTO foo VALUES(7,7);
приводит к исключительной блокировке для i= 7 & j = 7, а также блокировка общего намерения на i = 6 & j = 6
Я бы ожидал, что TX1 не будет заблокирован TX1, однако это так.Как ни странно, блокировка, кажется, связана со вставкой TX1.Я говорю это потому, что если оператор вставки TX1 не выполняется после удаления, вставка TX2 не блокируется.Это почти так, как будто повторная вставка TX1 (8,8) вызывает блокировку следующего ключа для индекса j для (6,8).
Любое понимание будет высоко ценится.