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 由於多使用者 多工的併發性和事務...