MySQL鎖機制與MVCC

1.MySQL服務器架構圖

架構

其實其底層構造和普通的網絡服務器有相似之處,解析器等主要負責SQL語句的解析,而所謂的存儲引擎其實本質就相當於是Linux上的文件系統層,這樣來看就清楚的多了,這說明MySQL必定會爲我們提高一個統一的訪問入口而不必去底層自己設計,這大大降低了數據庫的使用門檻。

2.共享鎖和排他鎖

  • 共享鎖(讀鎖):共享資源,用於不更改或不更新數據的操作(只讀操作),如 SELECT 語句
  • 排他鎖(寫鎖):用於數據修改操作,例如 INSERT、UPDATE 或 DELETE。確保不會同時同一資源進行多重更新。一個寫鎖會阻塞其他的寫鎖和讀鎖
    1.鎖粒度
    簡而言之,鎖粒度就是我們使用數據庫的行鎖或者表鎖時鎖定數據量的大小。
    一般來說鎖粒度越小系統併發性能越好,但同時加鎖時消耗的系統資源也會大大增加。因此在系統開銷和數據庫安全性之間找到一個平衡,也就是說選擇合適的鎖策略至關重要。
    2.表鎖(table lock)
    作用就和名字一樣會鎖定整張表,某用戶寫數據時會獲取寫鎖,讀時使用讀鎖,讀鎖之間互不阻塞。
    3.行級鎖(row lock)
    使用行級鎖可以最大程度的支持併發處理,當然此時開銷也最大,同時row lock只在存儲引擎層進行實現,而和MySQL服務器層無關。
    避免死鎖的方法:死鎖檢測和死鎖超時超時機制,一般採用死鎖檢測然後立刻回滾的策略實現

3.MVCC(多版本併發控制)

MVCC只工作在read committed和repeatable read兩種隔離級別之下,不支持其他的隔離級別。
簡單來說MVCC就是通過使用其他類型的輔助數據避免了在多種情況下的加讀鎖的操作,進一步提升了併發的性能。同時也解決了在repeatable read時會造成幻讀的現象
而所謂的輔助數據其實就是存儲引擎會爲每一行數據存儲兩列隱藏數據,分別是創建時間和刪除時間,創建時間是插入行時的系統版本號,刪除時間要麼是未定義的要麼就會是刪除該行時的系統版本號,需要注意的是系統版本號再開機之後每開始一個新的事務就會遞增事務版本號。
下圖詳細描述了InnoDB的MVCC在repeatable read隔離級別下的工作方式:
設定

4.InnoDB與MyISAM

myisam與innodb的區別:

  • 事務: InnoDB支持事務,而MyISAM不支持事務
  • 鎖: InnoDB支持行級鎖,而MyISAM只支持表級鎖
  • MVCC: InnoDB支持MVCC, 而MyISAM不支持
  • InnoDB支持外鍵,而MyISAM不支持
  • InnoDB不支持全文索引,而MyISAM支持
  • 索引: InnoDB是聚集索引,而MyISAM是非聚集索引

5.索引的組織形式

詳見下面博文
數據庫進階(文件的組織方式和索引)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章