mysql同一個事務中update,insert導致死鎖問題分析解決
現象:在一個repeatable read級別的事務中採用先update再insert的方式,當這段程式碼併發執行時造成死鎖;
示例如下: 如表student中只有一條記錄 ,該記錄的code 欄位值為1,且該表在code上建立索引。
transaction A:
update student set yn=1 where code = '2'; insert into student (code, …) values ('2', ...);
transaction B:
update student set yn=1 where code = '3'; insert into student (code, …) values ('3', ...);
此時A、B事務會出現死鎖現象。
原因:
在repeatable級別,update/select … for update/delete不存在的記錄時會hold一個X(互斥)gap鎖,當執行順序如下時:
T-A
update student set yn=1 where code = '2';
------T-A獲得一個X的next-key鎖T-B
update student set yn=1 where code = '3';
------T-B獲得一個X的next-key鎖T-B
insert into student (code, …) values ('3', ...);
------T-B需獲取一個insert intention gap lock,需等待T-A的next-key鎖釋放T-A
insert into student (code, …) values ('2', ...);
------T-A同理,等待T-B的next-key鎖釋放死鎖產生
解決方案:
第一種方案:將事務隔離級別降低到read committed即可,此時無gap鎖,T-A、T-B無衝突。
第二種方案:事務隔離級別仍然為repeatable read,但將引數innodb_locks_unsafe_for_binlog置為true。
原文連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4550/viewspace-2805610/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql insert導致死鎖MySql
- MySQL死鎖案例分析一(先delete,再insert,導致死鎖)MySqldelete
- 【MySQL】Merge Index導致死鎖MySqlIndex
- MySQL死鎖案例一(回滾導致死鎖)MySql
- MySQL死鎖案例二(自增列導致死鎖)MySql
- MySQL insert on duplicate key update 死鎖MySql
- Spring中同一個service中方法相互呼叫事務不生效問題解決方案Spring
- MySQL詳解--鎖,事務MySql
- 手把手教你分析解決MySQL死鎖問題MySql
- mysql insert into ... select的鎖問題MySql
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- mysql insert語句錯誤問題解決MySql
- pthread_once導致死鎖thread
- MySQL For Update導致全表排他鎖MySql
- MySQL 死鎖問題分析MySql
- MYSQL RC模式insert update 可能死鎖的情況MySql模式
- Mysql使用kill命令解決死鎖問題MySql
- InnoDB事務鎖之行鎖-delete流程update階段加鎖delete
- MySQL鎖問題分析-全域性讀鎖MySql
- MySQL鎖等待與死鎖問題分析MySql
- Go Mysql Driver 整合 Seata-Golang 解決分散式事務問題MySqlGolang分散式
- InnoDB事務鎖之行鎖-insert加鎖原理圖-聚集索引索引
- InnoDB事務鎖之行鎖-insert加鎖-隱式鎖加鎖原理
- MySQL 事務和鎖MySql
- MySQL事務與鎖MySql
- MySQL事務和鎖MySql
- sqlserver大數批次update時死鎖的問題及解決方案SQLServer
- mysql INSERT ... ON DUPLICATE KEY UPDATEMySql
- MyRocks事務鎖分析
- 記一次 MySQL select for update 死鎖問題MySql
- InnoDB事務鎖之行鎖-insert二級索引加鎖原理圖索引
- MySQL中的事務原理和鎖機制MySql
- MySQL 筆記 - 事務&鎖MySql筆記
- mysql之鎖與事務MySql
- mysql事務和鎖InnoDBMySql
- MySQL – 事務的啟動 / 設定 / 鎖 / 解鎖——入門MySql
- MySQL死鎖分析與解決之路MySql
- MysqL_select for update鎖詳解MySql