Mysql

INSERT..ON DUPLICATE KEY UPDATE 語句中的鎖定如何工作?

  • November 30, 2018

我在嘗試使用 INSERT..ON DUPLICATE KEY UPDATE 更新多行(一批)時遇到死鎖。MySQL 是鎖定一批中的所有行還是僅鎖定它在某個時間點更新的行?

這將取決於儲存引擎。

  • MyISAM:執行表級鎖。因此,所有行都被鎖定。
  • InnoDB: 使用行級鎖。由於 InnoDB 是事務性的,所有行都被隱式鎖定。當您執行時,這些鎖將是可見的SHOW ENGINE INNODB STATUS\G。如果您想事先手動鎖定這些行以防止共享,您可以執行SELECT … FOR UPDATE

從 mysql 5.7 開始,如果值(具有唯一索引)不存在,它將獲取 GAP 鎖。

INSERT INTO … SELECT … ON DUPLICATE KEY UPDATE 和 LOAD DATA CONCURRENT REPLACE 佔用的鎖太弱,導致並發 SELECT 語句返回不一致結果的可能性。(錯誤 #38046、錯誤 #11749055)

有關詳細資訊,請參閱此連結:

https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-0.html

引用自:https://dba.stackexchange.com/questions/52323