MySQL insert on duplicate key update 死鎖
出現的場景
- 業務上面臨高併發處理,由於資料可能頻繁進行寫入與更新,因此使用的是insert on duplicate key update語句,在高併發場景下,導致死鎖報錯
原因分析
- 死鎖的本質是多個事務等待對方所持有的資源釋放,且不會釋放自身所持有的資源,導致事務之間迴圈等待
- 透過查閱檔案以及資料庫分析,在on duplicate key時,會在前一個索引值到當前值加臨界鎖,而多個事務互相等待對方的鎖釋放,是造成死鎖的原因
- lock_mode X locks gap before rec insert intention waiting
出現的場景
- 業務上面臨高併發處理,由於資料可能頻繁進行寫入與更新,因此使用的是insert on duplicate key update語句,在高併發場景下,導致死鎖報錯
原因分析
- 死鎖的本質是多個事務等待對方所持有的資源釋放,且不會釋放自身所持有的資源,導致事務之間迴圈等待
- 透過查閱檔案以及資料庫分析,在on duplicate key時,會在前一個索引值到當前值加臨界鎖,而多個事務互相等待對方的鎖釋放,是造成死鎖的原因
- lock_mode X locks gap before rec insert intention waiting
舉例說明
在以下結構中,value欄位存在唯一索引
----------------------
id value
----------------------
1 1
3 3
5 5
----------------------
事務A
// step1 執行到此處時,由於value=3已存在,此時會對(1,3]加臨鍵鎖insert into table(value) values(3) on duplicate key update value = 7; // step3 執行到此處時,由於3~5的區間已被鎖住,需要等待事務2釋放臨鍵鎖insert into table(value) values(4) on duplicate key update value = 7;
事務B
// step2 執行到此處時,由於value=5已存在,此時會對(3,5]加臨鍵鎖insert into table(value) values(5) on duplicate key update value = 8; // step4 執行到此處時,由於1~3的區間已被鎖住,需要等待事務1釋放臨鍵鎖insert into table(value) values(2) on duplicate key update value = 8;
當執行順序按照step1~step4執行時,便會形成死鎖
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30443223/viewspace-2936979/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL 關於 INSERT INTO...ON DUPLICATE KEY UPDATE 的使用MySql
- BUG: pymysql executemany不支援insert on duplicate key updateMySql
- MySQL_插入更新 ON DUPLICATE KEY UPDATEMySql
- 翻譯:insert on duplicate key update(已提交到MariaDB官方手冊)
- on duplicate key update簡單使用
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- MySQL死鎖案例分析一(先delete,再insert,導致死鎖)MySqldelete
- 記一次 MySQL select for update 死鎖問題MySql
- mysql update join,insert select 語法MySql
- 故障分析 | 從 Insert 併發死鎖分析 Insert 加鎖原始碼邏輯原始碼
- mysql insert導致死鎖MySql
- mysql同一個事務中update,insert導致死鎖問題分析解決MySql
- insert引起的死鎖,起因主鍵衝突
- MySQL 死鎖和鎖等待MySql
- mysql 在delete、insert、update 時,page的變化MySqldelete
- mysql insert into ... select的鎖問題MySql
- MYSQL報1022錯誤:Can't write;duplicate key in table '.....'MySql
- MySQL 共享鎖 (lock in share mode),排他鎖 (for update)MySql
- mysql for update是鎖表還是鎖行MySql
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- MySQL 死鎖解決MySql
- MySQL解決死鎖MySql
- MySQL死鎖問題MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- mysql行鎖和死鎖檢測MySql
- Mysql 兩階段鎖和死鎖MySql
- mysql死鎖最佳化MySql
- MySQL:死鎖一例MySql
- MySQL 死鎖問題分析MySql
- 【MySQL】死鎖案例之六MySql
- 【MySQL】死鎖案例之七MySql
- 【MySQL】死鎖案例之八MySql
- Mysql如何處理死鎖MySql
- MySQL列印死鎖日誌MySql
- MySQL:MTS和mysqldump死鎖MySql
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- MySQL鎖等待與死鎖問題分析MySql
- MySQL:Innodb 一個死鎖案例MySql