mysql死鎖 簡述

2022-01-31 16:43:38 字數 916 閱讀 2534

死鎖:相互等待對方的資源,而且形成環路,造成首尾相接

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...