1 .獲取innodb行鎖爭用情況 1.1 通過檢查innodb_row_lock狀態變數來分析系統上的行鎖的爭奪情況 通過innodb_row_lock_waits 和 innodb_row_lock_avg 的值來判斷行鎖爭用情況,值高意味著爭用比較嚴重。 1.2 通過檢查 innodb mon ...
1 .獲取innodb行鎖爭用情況
1.1 通過檢查innodb_row_lock狀態變數來分析系統上的行鎖的爭奪情況
SHOW STATUS LIKE 'innodb_row_lock%'
通過innodb_row_lock_waits 和 innodb_row_lock_avg 的值來判斷行鎖爭用情況,值高意味著爭用比較嚴重。
1.2 通過檢查 innodb monitors來觀察發生鎖衝突的表,數據行等,並分析鎖爭用的原因
-- 查看分析 SHOW ENGINE INNODB STATUS;
status內容中會詳細說明當前鎖等待的信息,包括表名,鎖類型,鎖定記錄的情況等,以便進行進一步的分析和問題的確定。以後在詳細分析
2. innodb 行鎖模式及加鎖方法
兩種鎖模式(類型)共用鎖, 排它鎖。
共用鎖(S):允許其它事務讀取該行數據,阻止其它事務獲取排他鎖去更新。
排它鎖(x): 阻止其它事務讀取或更新。
為了允許行鎖和表鎖共存,實現多粒度鎖機制,innodb內部使用意向鎖,這二種意向鎖都是表鎖。
意向共用鎖(IS): 當前事務打算給數據行加S鎖,必須先取得該表的IS鎖。
意向排它鎖(IX): 當前事務打算給數據行加x鎖,必須先取得該表的IX鎖。
下圖是innodb 行鎖模式相容性列表
通過上圖可以總結出來: S與IS鎖在事務與事務之間是相容的。 ix鎖與(ix鎖或is鎖)在事務與事務之間是相容的。 is鎖與(IX,S,IS鎖)是相容的。X鎖與其它鎖是互斥的。
當事務將要獲取的鎖與其它事務的鎖相容時,就會授予該事務鎖,否則該事務就要等待其它事務鎖的釋放。
對於update,delete,insert語句,innodb會自動給涉及的數據集加X鎖(對於delete,update會先加S鎖再升級為X鎖)。
對於普通的select語句innodb會加S鎖。
3. 語句級加鎖
lock in share mode(語句集上加IS鎖)
在select 語句最後加上lock in share mode相當於手動加上共用鎖。確保當前沒有人對該記錄進行update或delete操作。
for update(語句集上加IX鎖)
select for update是對鎖定行記錄後,需要進行更新操作的應用。
(未完)