Mysql資料庫死鎖分析相關概念

2022-08-27 16:03:11 字數 1178 閱讀 6275

mysql死鎖問題分析(

mysql insert鎖機制( insert鎖機制/)

這是全網找到的比較好的兩篇部落格。

innodb有三種行鎖的演算法:

1,record lock:單個行記錄上的鎖。

2,gap lock:間隙鎖,鎖定乙個範圍,但不包括記錄本身。gap鎖的目的,是為了防止同一事務的兩次當前讀,出現幻讀的情況。

3,next-key lock:1+2,鎖定乙個範圍,並且鎖定記錄本身。對於行的查詢,都是採用該方法,主要目的是解決幻讀的問題。

update、delete where為主鍵,只在單個行記錄上鎖。

不在索引上,會鎖整個表。

參考:據庫上的操作可以歸納為兩種:讀和寫。

多個事務同時讀取乙個物件的時候,是不會有衝突的。同時讀和寫,或者同時寫才會產生衝突。因此為了提高資料庫的併發效能,通常會定義兩種鎖:共享鎖和排它鎖。

共享鎖(shared lock,也叫s鎖)(讀鎖)

排他鎖(exclusive lock,也叫x鎖) (寫鎖)

鎖行一般都是x鎖

表a欄位a關聯了表b欄位id,則表a的insert會在表b對應索引行新增s鎖。

檢視資料庫版本:

select version();
檢視資料庫引擎:

show variables like '%engine%';
檢視事務隔離級別:

select @@global.tx_isolation, @@session.tx_isolation, @@tx_isolation;
檢視gap鎖開啟狀態:

show variables like 'innodb_locks_unsafe_for_binlog';
檢視innodb狀態(包含最近的死鎖日誌)

show engine innodb status;
當發生鎖等待時,可以通過以下命令檢視各事務占用鎖的情況。

select * from information_schema.innodb_locks;
注意lock_mode欄位。

另外一篇非常有用的部落格:

詳細分析了如果有事務卡住,檢視卡住的地方在**的步驟。

mysql資料庫死鎖

當我們頻繁的對資料庫進行插入或更新的時候,有可能會直接報sql錯誤1205 lock wait timeout exceeded。資料庫的死鎖。一般innodb資料庫會自動新增事務,當進行插入或者更新的時候,如果上次commit尚未執行完,而又有一次新的commit提交的時候,系統就會報sql錯誤1...

MySQL 資料庫死鎖

也可以根據物件模糊匹配直接查詢死鎖的session資訊select vl.session id b.serial ao.object name,b.from vlocked object vl,all objects ao,vsession b where vl.object id ao.objec...

資料庫死鎖分析與解決

一 死鎖的表現 1 錯誤資訊是 事務 程序 id 與另乙個程序被死鎖在 鎖 資源上,並且已被選作死鎖犧牲品。請重新執行該事務。2 錯誤資訊是 事務 程序 id 與另乙個程序被死鎖在 鎖 通訊緩衝區 資源上,並且已被選作死鎖犧牲品。請重新執行該事務。二 死鎖的原因 1 由於多使用者 多工的併發性和事務...