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

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

【问题讨论】:

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

标签: mysql insert-update database-deadlocks


【解决方案1】:

根据MySQL Developer Doc

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 2016-07-22
    • 2015-07-30
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多