我想在非主键字段中插入具有唯一值的行。我无法使用唯一索引(因为多个字段索引中的NULL值,但这里并不重要)。MySQL - 为什么一个插入锁定第二个插入?
我使用INSERT/SELECT WHERE NOT EXISTS作为原子(我希望)操作 - 请参见下文。
我将描述问题上简化的例子:
我有一个空表:
CREATE TABLE Test ( Id int(11) NOT NULL AUTO_INCREMENT, A int(11) DEFAULT NULL, PRIMARY KEY (Id) ) ENGINE=InnoDB;
...和2个会话与自动提交模式关闭:
在第一会话我执行:
INSERT INTO Test (A) SELECT A FROM (SELECT 1 AS A) Inn WHERE NOT EXISTS (SELECT A FROM Test WHERE A = 1 FOR UPDATE);
在第二届会议上我执行:
INSERT INTO Test (A) SELECT A FROM (SELECT 2 AS A) Inn WHERE NOT EXISTS (SELECT A FROM Test WHERE A = 2 FOR UPDATE);
正如你所看到的,我将独立的值。但是第二次会议被第一次会议锁定。为什么?也许这是因为间隙/下一个键锁定。
我怎么能插入记录与“手动”避免重复键和没有相互锁定?
默认的事务隔离级别是REPEATABLE READ,我不想更改数据库的默认设置,因为其他应用程序使用它。
这似乎是一个非常复杂的方法来执行INSERT IGNORE。这种方法的理由是什么? – Arnout
因为我可以在一些唯一索引列中有NULL。你有什么想法我可以插入唯一值吗? – Marek