資料庫 mysql 死鎖問題記錄

2021-10-24 12:35:44 字數 1229 閱讀 8832

工作中遇到了deadlock found when trying to get lock;try restarting transaction; 資料庫發生死鎖了.

資料庫的事務隔離級別是rr(repeatable read)

1)通過命令 show engine innodb status,將status中的記錄另存為txt檔案,檢視死鎖語句和原因

2)通過命令 show variables like "innodb_print_all_deadlocks",查詢是否開啟了死鎖日誌,沒有的話;通過

set global innodb_print_all_deadlocks=on,開啟死鎖日誌

select @@log_error,顯示死鎖日誌所在路徑

檢視日誌去分析死鎖原因.

issue:

在我遇到的情況中,死鎖語句是事務a執行replace into ...,這個語句約等於delete+insert;獲取delete from *** ,獲取next_key lock鎖(x鎖+前後gap鎖)後,另乙個事務b也執行replace into ...,等待從事務a獲取next_key lock;事務a的insert語句在獲取x鎖(獨佔鎖/讀鎖)之前,需要獲取 插入意向鎖(intention insert lock,特殊gap鎖),需要等待事務b先獲取事務a的next_key lock;

故簡而言之:b的replace into 等待獲取a的next_key lock;a的insert等待b獲取next_key lock後才能獲取插入意向鎖,死鎖;

solution:

gap鎖(間隙鎖)是在rr才有的,降級到隔離級別rc(read committed),沒有間隙鎖,可以解決問題;

其實還可以改變sql的執行順序,從**層面避免死鎖;

參考了其他人的鎖相容**,這個隨便搜搜就有.

使用到的其他mysql命令:

//檢視隔離級別

show variables like "tx_isolation"

或者 select @@tx_isolation

//設定隔離級別為rc

set session transaction isolation level read committed

mysql解決資料庫死鎖問題

為了保證資料的正確性,對資料庫進行操作的時候都會進行上鎖,也就是進行修改資料的時候同一時間只能有乙個程序,當這個程序處理完了,釋放鎖了,其他程序才可以進行操作!總是會碰見一些意外情況,導致資料庫死鎖,任何程序操作該資料都會拋異常,也無法修改成功!這個時候我們可以找到對應的資料庫事務程序,殺死程序即可...

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