Innodb鎖探究

1.1表鎖

  • 讀鎖git

  • 寫鎖github

  • 查看錶鎖的爭用狀況sql

    show status like 'table%';
    複製代碼

    Table_locks_immediate:產生表級鎖定的次數;bash

    Table_locks_waited:出現表級鎖定爭用而發生等待的次數;優化

1.2頁鎖

1.3 行鎖

1.3.1 記錄鎖

  • 共享鎖(S鎖)

select * from table_name where ... lock in share mode;spa

  • 排他鎖(X鎖)

select * from table_name where ... for update;.net

  • 行鎖的實現方式

Innodb行鎖是經過給索引項加鎖來實現的,只有經過索引條件檢索數據,Innodb才使用行級鎖,不然,InnoDB將使用表鎖。日誌

1.3.2 注意事項(加鎖模式) 重點
  • RC,RR隔離級別下,排他鎖鎖住一行數據的時候,其餘事務依舊能夠經過普通查詢查詢數據,由於普通查詢使用MVCC(快照讀)不須要加鎖。只有加鎖的操做纔會出現阻塞。
  • 在不經過索引條件查詢的時候,InnoDB確實使用的是表鎖,而不是行鎖 。
  • 行鎖是針對索引加的鎖,而不是爭對記錄加鎖,雖然訪問不一樣的記錄,可是若是使用相同的索引仍是會出現鎖衝突,例如非惟一索引的狀況就會發生。
  • 即便使用了索引Innodb也不必定會使用行鎖,若是執行優化引擎認爲全表掃描效率更高就不會使用索引,因此在查看鎖衝突時要查看sql的執行計劃是否真正使用了索引。

1.3.3 間隙鎖(Gap Lock)

當咱們用範圍條件而不是相等條件檢索數據,並請求共享或排他鎖時,Innodb會給符合條件的已有數據記錄的索引項加鎖,對於鍵值在條件範圍內但並不存在的記錄,Innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖。code

1.3.4 臨間鎖(Next-key)

鎖定記錄的同時會鎖記錄cdn

1.4 意向鎖

  • 意向共享鎖(IS)

  • 意向排他鎖(IX)

    意向鎖的做用就是協調行鎖和表鎖之間的關係的,是將行鎖從另外一個角度提升到了表鎖的等級(僞表鎖),與表鎖進行判斷。

  • 參考文章 :www.jianshu.com/p/95a0d10eb…

1.5 分析SQL語句加什麼鎖

  1. SQL1:select * from t1 where id = 1;

  2. SQL2:delete from t1 where id = 1;

  • 前提一:當前系統的隔離級別
  • 前提二:id列是不是主鍵
  • 前提三:若是id列不是主鍵,id列是否存在索引
  • 前提四:若是id列存在索引,是否是惟一索引
  • 前提五:兩條sql的執行計劃是什麼,全表掃描or索引掃描

1.6 死鎖分析

1.6.1 死鎖日誌

show engine innodb status;

1.6.2 死鎖預防

  • 深刻理解業務,瞭解整個事務的處理邏輯。

  • GAP鎖很複雜,爲了減小GAP鎖致使的死鎖,儘可能選擇RC隔離級別。

  • 適當的減小Unique索引,能夠減小GAP鎖致使的死鎖。

  • 以不一樣的索引過濾條件,來操作相同的記錄,很容易產生死鎖。

  • 參考文章

參考文章

相關文章
相關標籤/搜索