相关疑难解决方法(0)

使用主键和唯一键对表进行意外锁定

我遇到了一个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,在单独的连接中)

TX1

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

TX2

START TRANSACTION; 
INSERT INTO foo VALUES(7,7); 
Run Code Online (Sandbox Code Playgroud)

导致i = 7&j = 7的排他锁定,以及i …

mysql database performance innodb locking

9
推荐指数
1
解决办法
4354
查看次数

标签 统计

database ×1

innodb ×1

locking ×1

mysql ×1

performance ×1