死鎖:相互等待對方的資源,而且形成環路,造成首尾相接
innodb將各個事務看為乙個個節點,資源就是各個事務占用的鎖
死鎖成因:
1、不同表相同記錄行鎖衝突
事務a和事務b操作兩張表
(a操作table1 where id = 1 && table2 where =2)
(b操作table2 where id = 2 && table1 where =1)
2、相同表記錄行鎖衝突
事務a和事務b操作同一張表
(a操作update table where id = 1 && update table where =2)
(b操作update table where id = 2 && update table where =1)
3、不同索引鎖衝突
事務a在執行時,除了在二級索引加鎖外,還會在聚簇索引上加鎖,在聚簇索引上加鎖的順序是[1,4,2,3,5],
而事務b執行時,只在聚簇索引上加鎖,加鎖順序是[1,2,3,4,5],這樣就造成了死鎖的可能性
4、gap鎖衝突
避免死鎖:
1、固定的順序訪問表和行
兩個批量更新的情形,簡單方法是對id列表先排序,後執行,這樣就避免了交叉等待鎖的情形
2、大事務拆小。大事務更傾向於死鎖,如果業務允許,將大事務拆小
3、同乙個事務中,盡可能做到一次鎖定所需要的所有資源,減少死鎖概率(abc表都鎖)。
4、降低隔離級別,可重複讀(rr)替換已提交讀(rc)
5、為表新增合理的索引。可以看到如果不走索引將會為表的每一行記錄新增上鎖,死鎖的概率大大增大
定位死鎖成因:
1、應用業務日誌定位到問題**,找到相應的事務對應的sql,執行sql 如果死鎖時這個事務被回滾
2、執行下show innodb status看看最近死鎖的日誌
mysql 死鎖語句 MySQL死鎖
死鎖產生 行鎖的具體實現演算法有三種 record lock gap lock以及next key lock。record lock是專門對索引項加鎖 gap lock是對索引項之間的間隙加鎖 next key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。只在可重複讀或以上隔離級別下的特...
簡述mysql應用 MYSQL使用簡述
您可能感興趣的話題 mssql 一 連線mysql。1 例1 連線到本機上的mysql。首先在開啟dos視窗,然後進入目錄 mysqlbin,再鍵入命令mysql uroot p,回車後提示你輸密碼,如果剛安裝好mysql,超級使用者root是沒有密碼的,故直接回車即可進入到mysql中了,mysq...
mysql事務死鎖 MySQL事務 死鎖
一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...