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 语句中的锁定如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
正确的 INSERT .. ON DUPLICATE KEY 语法?
INSERT IGNORE & UPDATE VS INSERT...ON DUPLICATE KEY UPDATE [重复]