Mysql
INSERT..ON DUPLICATE KEY UPDATE 語句中的鎖定如何工作?
我在嘗試使用 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