我遇到了一个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);
Run Code Online (Sandbox Code Playgroud)
(注意:只需在TX1 sql之后运行TX2 sql,在单独的连接中)
START TRANSACTION;
DELETE FROM foo WHERE i=8;
Run Code Online (Sandbox Code Playgroud)
导致i = 8的独占锁定(没有间隙锁定,因为我是主键并且是唯一的)
INSERT INTO foo VALUES(8,8);
Run Code Online (Sandbox Code Playgroud)
导致i = 8&j = 8的独占锁定,i = 6&i = 7的共享意图锁定,以及j = 6&j = 7
START TRANSACTION;
INSERT INTO foo VALUES(7,7);
Run Code Online (Sandbox Code Playgroud)
导致i = 7&j = 7的排他锁定,以及i …