mysql死鎖以及死鎖日誌分析

2021-08-22 02:34:15 字數 1948 閱讀 7244

死鎖的概念

死鎖:死鎖一般是事務相互等待對方資源,最後形成環路造成的。

對於死鎖,資料庫處理方法:犧牲乙個連線,保證另外乙個連線成功執行。

發生死鎖會返回error:1213 錯誤提示,大部分的死鎖innodb儲存引擎本身可以偵測到,不需要人為進行干預。

注意:innodb儲存引擎並不會回滾大部分的錯誤異常,像阻塞章節裡面的例子,但是死鎖例外,發現死鎖後,innodb儲存引擎會馬上回滾乙個事務,會返回1213錯誤。

死鎖的情形舉例

分析死鎖日誌:

第一部分

從日誌裡我們可以看到事務1當前正在執行update info_users set mobile='18514656666' where mobile='18514656620',該條語句正在申請表info_users的索引idx_mobile的x鎖,所以提示lock_mode x waiting

第二部分:

然後日誌的下半部分說明了事務2當前『持有的鎖』以及『等待的鎖』:

從日誌的holds the locks(s)塊中我們可以看到事務2持有索引idx_mobile的x鎖,並且是記錄鎖(record lock)。該鎖是通過事務2在步驟2執行的update語句申請的。

從日誌的waiting for this lock to be granted塊中我們可以看到事務2正在申請持有表info_area的索引gen_clust_index的x鎖,該鎖是delete from info_area where id=1;語句申請的。

分析死鎖日誌:

第一部分

從日誌裡我們可以看到事務1當前正在執行delete from users where uid='bbb';,該條語句正在申請索引uid的x鎖,所以提示lock_mode x waiting

第二部分:

然後日誌的下半部分說明了事務2當前『持有的鎖』以及『等待的鎖』:

從日誌的holds the locks(s)塊中我們可以看到事務2持有索引uid的x鎖,並且是記錄鎖(record lock)。該鎖是通過事務2在步驟2執行的delete語句申請的。

從日誌的waiting for this lock to be granted塊中我們可以看到事務2正在申請持有索引uid的s鎖,該鎖是insert into users values(2,'bbb');語句申請的。insert語句在普通情況下是會申請x鎖,但是這裡出現了s鎖。這是因為uid欄位是乙個索引,所以insert語句會在插入前進行一次duplicate key的檢查,為了使這次檢查成功,需要申請s鎖防止其他事務對uid欄位進行修改。

那麼為什麼該s鎖會失敗呢?這是對同乙個欄位的鎖的申請是需要排隊的。s鎖前面還有乙個未申請成功的x鎖,所以s鎖必須等待,所以形成了迴圈等待,死鎖出現了。

通過閱讀死鎖日誌,我們可以清楚地知道兩個事務形成了怎樣的迴圈等待,再加以分析,就可以逆向推斷出迴圈等待的成因,也就是死鎖形成的原因。

死鎖以及避免死鎖

目錄 一 什麼是死鎖 二 產生死鎖的四個必要條件 三 避免死鎖的方法 是指兩個或兩個以上的程序在執行過程中,由於競爭資源或者由於彼此通訊而造成的一種阻塞的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。1.互斥 某種資源一次只允...

mysql 死鎖語句 MySQL死鎖

死鎖產生 行鎖的具體實現演算法有三種 record lock gap lock以及next key lock。record lock是專門對索引項加鎖 gap lock是對索引項之間的間隙加鎖 next key lock則是前面兩種的組合,對索引項及其之間的間隙加鎖。只在可重複讀或以上隔離級別下的特...

mysql事務死鎖 MySQL事務 死鎖

一 概念 多個事務在同一資源上互相占用形成迴路。這就是死鎖 基本命令 檢視是否自動提交事務 show variables like autocommit 設定事務是否自動提交 set autocommit 0 set autocommit 1 二 例子 create table user id bi...