0

在 MySQL 中,如果我有一个 INSERT IGNORE 命令,由于唯一性约束,它最终不会插入到表中。它是否要求并等待写锁?或者 MySQL 是否识别 IGNORE 关键字,并在写锁之前使用读锁,只有当它真的需要写时才请求写锁?

4

1 回答 1

3

这取决于引擎 - MyIsam 和 InnoDb 的行为不同。

对于 MyIsam 表,如果表中已经存在一条记录(即使它尚未提交),则在另一个会话中对同一条记录(相同的唯一键)进行常规 INSERT 会报告重复键错误 - 所以 INSERT IGNORE 只是忽略错误并继续进行。

在 InnoDB 表上,如果记录没有被锁定,常规的 INSERT 会立即报告重复键错误(INSERT IGNORE 会跳过错误继续执行)。
但是如果记录被其他会话锁定(例如记录已插入但尚未提交,或者记录被 UPDATE 或 DELETE 或 SELECT FOR UPDATE 命令锁定),则 INSERT 命令将“挂起”并等待直到另一个会话将删除锁(通过 COMMIT 或 ROLLBACK)。然后,如果删除锁后记录仍然存在,INSERT 会报错(INSERT IGNORE 会忽略该错误),但如果记录不存在,INSERT 会将这条记录添加到表中。

IGNORE 关键字只是说“如果出现任何错误,请继续忽略它”,但它不会影响锁定行为。

于 2013-08-11T22:28:18.637 回答