对于此表,在mysql 5.7中,
CREATE TABLE `t` (
`id` int(10) unsigned NOT NULL,
`val` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;我需要插入到这个表中,但是id值存在于超过50%的情况中。如果不存在" INSERT“,我希望使用单个INSERT忽略而不是"SELECT id”
当执行INSERT忽略时(而不是多插入键),并且主键存在,是否/是否涉及任何锁定?
发布于 2022-06-17 15:26:19
这可以在测试中得到证实。打开两扇窗户。
在第一个窗口:
mysql> insert into t values (1, 10), (3, 30);
mysql> begin;
mysql> insert ignore into t values (1, 10);
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> show warnings;
+---------+------+-----------------------------------------+
| Level | Code | Message |
+---------+------+-----------------------------------------+
| Warning | 1062 | Duplicate entry '1' for key 't.PRIMARY' |
+---------+------+-----------------------------------------+事务仍然未提交,因此如果我们锁定了行,则此事务仍然持有锁。
现在在第二个窗口:
mysql> update t set val = val * 2 where id = 1;
<hangs waiting for lock>显然,第一个窗口中的INSERT忽略确实获得了一个锁。
https://dba.stackexchange.com/questions/313465
复制相似问题