对于这个表,在 mysql 5.7 中,
CREATE TABLE `t` (
`id` int(10) unsigned NOT NULL,
`val` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
- 该表没有自动增量列
- 该表没有分区
- 只有在此表上执行的查询是INSERT和SELECT
- 该表未在任何子查询中使用
- sql_mode 没有启用任何 STRICT_*
我需要插入此表,但该id
值存在于 >50% 的案例中。我想使用单个 INSERT IGNORE 而不是 "SELECT id" ,如果不存在 "INSERT"
当执行 INSERT IGNORE (不是多插入)并且PRIMARY KEY存在时,是否/可以涉及任何锁定?
这可以在测试中得到证实。打开两个窗口。
在第一个窗口中:
该事务仍未提交,因此如果我们锁定了该行,该事务仍然持有该锁。
现在在第二个窗口中:
显然,第一个窗口中的 INSERT IGNORE 确实获得了锁。