INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?

Posted

技术标签:

【中文标题】INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?【英文标题】:How does locking work in INSERT..ON DUPLICATE KEY UPDATE statements? 【发布时间】:2013-11-07 05:56:45 【问题描述】:

我在尝试使用 INSERT..ON DUPLICATE KEY UPDATE 更新多行(一批)时遇到死锁。 mysql 是锁定一批中的所有行还是只锁定它在某个时间点更新的行?

【问题讨论】:

对于dba.stackexchange.com来说可能是一个更好的问题 如果禁用了自动提交,那么 MySql 会在所有接触的行上加锁,并在提交时释放已放置的锁。以一致的顺序插入记录(插入前按主键值对一批记录进行排序)以避免死锁。 【参考方案1】:

根据MySQL Developer Doc:

在 MySQL 5.6.6 之前,使用存储引擎(如 MyISAM)对分区表执行 INSERT ... ON DUPLICATE KEY UPDATE,该存储引擎使用表级锁锁定表的所有分区。 (这在使用存储引擎(如 InnoDB)的表中不会发生,也不会发生。) 在 MySQL 5.6.6 及更高版本中,此类语句仅锁定具有分区键的分区列已更新。有关详细信息,请参阅第 18.6.4 节“分区和锁定”。

我猜InnoDB会使用索引并避免表级锁定(除非表太小以至于MySQL会直接使用表级锁定)。

【讨论】:

以上是关于INSERT..ON DUPLICATE KEY UPDATE 语句中的锁定如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

mysql insert on duplicate key

正确的 INSERT .. ON DUPLICATE KEY 语法?

INSERT IGNORE & UPDATE VS INSERT...ON DUPLICATE KEY UPDATE [重复]

INSERT ON DUPLICATE KEY:一起添加值

mysql INSERT ... ON DUPLICATE KEY UPDATE语句

mysql INSERT ... ON DUPLICATE KEY UPDATE语句