INSERT IGNORE是否会锁定表,即使它忽略了插入?

时间:2013-08-11 08:47:39

标签: mysql insert

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

1 个答案:

答案 0 :(得分:3)

这取决于发动机 - MyIsam和InnoDb表现不同。

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

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

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