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 ... ON DUPLICATE KEY UPDATEMySql
- MySQL批量Insert應用ON DUPLICATE KEY UPDATEMySql
- MySQL 5.5 INSERT ... ON DUPLICATE KEY UPDATE語句說明MySql
- MySQL 關於 INSERT INTO...ON DUPLICATE KEY UPDATE 的使用MySql
- MYSQL RC模式insert update 可能死鎖的情況MySql模式
- MySQL_插入更新 ON DUPLICATE KEY UPDATEMySql
- BUG: pymysql executemany不支援insert on duplicate key updateMySql
- 翻譯:insert on duplicate key update(已提交到MariaDB官方手冊)
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- REPLACE與INSERT INTO ... ON DUPLICATE KEY總結
- 【Mysql】兩條select for update引起的死鎖MySql
- MySQL死鎖案例分析一(先delete,再insert,導致死鎖)MySqldelete
- 【Mysql】兩條insert 語句產生的死鎖MySql
- 記一次 MySQL select for update 死鎖問題MySql
- MYSQL INNODB replace into 死鎖 及 next key lock 淺析MySql
- MySQL 死鎖和鎖等待MySql
- 故障分析 | 從 Insert 併發死鎖分析 Insert 加鎖原始碼邏輯原始碼
- 死鎖: delete+insert不存在PKdelete
- mysql insert導致死鎖MySql
- Q:[Vue warn]: Duplicate keys detected: ‘PAYACT‘. This may cause an update error.VueError
- mysql update join,insert select 語法MySql
- mysql操作命令梳理(2)-alter(update、insert)MySql
- mysql innodb新建索引堵塞update ,insert,deleteMySql索引delete
- 面試:什麼是死鎖,如何避免或解決死鎖;MySQL中的死鎖現象,MySQL死鎖如何解決面試MySql
- MySQL死鎖系列-線上死鎖問題排查思路MySql
- MySQL 死鎖解決MySql
- MySQL死鎖問題MySql
- 【MySQL】漫談死鎖MySql
- MySQL解決死鎖MySql
- mysql同一個事務中update,insert導致死鎖問題分析解決MySql
- vue報錯之Duplicate keys detected: '0'. This may cause an update error.VueError
- MySQL pt-duplicate-key-checker工具使用初探MySql
- MySQL 共享鎖 (lock in share mode),排他鎖 (for update)MySql
- mysql for update是鎖表還是鎖行MySql
- mysql行鎖和死鎖檢測MySql
- Mysql 兩階段鎖和死鎖MySql
- MySQL:一個死鎖分析 (未分析出來的死鎖)MySql
- MySQL 死鎖問題分析MySql