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
- [20180801]insert導致死鎖.txt
- 【MySQL】Merge Index導致死鎖MySqlIndex
- MySQL insert on duplicate key update 死鎖MySql
- mysql insert into ... select的鎖問題MySql
- Spring中同一個service中方法相互呼叫事務不生效問題解決方案Spring
- MySQL死鎖案例一(回滾導致死鎖)MySql
- MySQL死鎖案例二(自增列導致死鎖)MySql
- 手把手教你分析解決MySQL死鎖問題MySql
- 什麼是鎖?深入分析解讀MySQL鎖,解決幻讀問題!MySql
- pthread_once導致死鎖thread
- MySQL 死鎖問題分析MySql
- 記一次 MySQL select for update 死鎖問題MySql
- Mysql使用kill命令解決死鎖問題MySql
- MySQL鎖問題分析-全域性讀鎖MySql
- MySQL鎖等待與死鎖問題分析MySql
- mysql update join,insert select 語法MySql
- Go Mysql Driver 整合 Seata-Golang 解決分散式事務問題MySqlGolang分散式
- mysql 高併發 select update 併發更新問題解決方案MySql
- MySQL事務與鎖MySql
- MySQL 事務和鎖MySql
- MySQL事務和鎖MySql
- 解決pod install update很慢的問題
- MyRocks事務鎖分析
- MySQL死鎖分析與解決之路MySql
- MySQL中SELECT+UPDATE併發更新問題MySql
- For Update 加鎖分析
- MySQL – 事務的啟動 / 設定 / 鎖 / 解鎖——入門MySql
- MySQL 筆記 - 事務&鎖MySql筆記
- mysql之鎖與事務MySql
- MySQL中的事務原理和鎖機制MySql
- Mysql(MyISAM)的讀寫互斥鎖問題的解決方法MySql
- InnoDB 事務加鎖分析
- MySql 三大知識點,索引、鎖、事務,原理分析MySql索引
- Spring Boot 整合 Seata 解決分散式事務問題Spring Boot分散式
- 故障分析 | 從 Insert 併發死鎖分析 Insert 加鎖原始碼邏輯原始碼
- 使用Seata徹底解決Spring Cloud中的分散式事務問題!SpringCloud分散式