在查询中使用IGNORE时,MySQL是否仍会发出死锁错误?

时间:2015-04-16 13:23:37

标签: mysql sql database-deadlocks

我之前在IGNORE次查询中使用了mysql我通常会在尝试插入mysql时使用它来避免duplicate key返回错误,但是我我不确定这是如何工作的 - mysql在使用IGNORE时是忽略错误还是只忽略duplicate key错误?

因此,例如,如果发生deadlock,在查询中使用IGNORE时仍然会发出错误吗?

修改

进行更多阅读并找到此信息:

  

如果使用IGNORE关键字,则忽略执行INSERT语句时出现的错误。例如,如果没有IGNORE,则复制表中现有UNIQUE索引或PRIMARY KEY值的行会导致重复键错误,语句中止。使用IGNORE,该行将被丢弃并且不会发生错误。虽然重复键错误没有,但忽略错误可能会生成警告。

嗯,我想这意味着死锁错误只会产生警告呢?

1 个答案:

答案 0 :(得分:1)

IGNORE关键字仅忽略重复键错误,并且不会插入具有重复键的这些行,而是没有错误的其他行。将生成警告。

如果并发 INSERT如果某个其他线程锁定了“唯一值”集,那么您的线程将等待锁释放并超出死锁/锁等待超时错误。 在这种情况下,不会插入任何行(该语句)并返回ERROR

有桌子:

CREATE TABLE `t` (
    `id` INT(11) NOT NULL,
    PRIMARY KEY (`id`)
)
ENGINE=InnoDB;

现在同时运行这两个查询:

INSERT IGNORE INTO t(id)
VALUES (5+sleep(1)),(6+sleep(1)),(3+sleep(1)),(4+sleep(1));
/* Affected rows: 4  Found rows: 0  Warnings: 0  Duration for 1 query: 4,586 sec. */

INSERT IGNORE INTO t(id)
VALUES (3+sleep(1)),(4+sleep(1)),(5+sleep(1)),(6+sleep(1));
/* SQL Error (1213): Deadlock found when trying to get lock; try restarting transaction */
/* Affected rows: 0  Found rows: 0  Warnings: 0  Duration for 0 of 1 query: 0,000 sec. */