數據庫鎖分類和總結

鎖的分類

按粒度分類:

  • 表級鎖
  • 行級鎖
  • 頁級鎖

按鎖級別分類:

  • 共享鎖
  • 排他鎖

按加鎖方式分類:

  • 自動鎖
  • 顯式鎖

按操作分類:

  • DML鎖
  • DDL鎖

按使用方式分類:

  • 樂觀鎖
  • 悲觀鎖

按粒度分類

表級鎖

顧名思義,鎖定一張數據表(而不是表空間)。

表鎖的優勢:開銷小;加鎖快;無死鎖
表鎖的劣勢:鎖粒度大,發生鎖衝突的概率高,併發處理能力低
加鎖的方式:自動加鎖。查詢操作(SELECT),會自動給涉及的所有表加讀鎖,更新操作(UPDATE、DELETE、INSERT),會自動給涉及的表加寫鎖。
也可以顯示加鎖:
共享讀鎖:lock table tableName read;
獨佔寫鎖:lock table tableName write;
批量解鎖:unlock tables;

表級鎖又分爲5類:

  • 行共享 (ROW SHARE) – 禁止排他鎖定表

  • 行排他(ROW EXCLUSIVE) – 禁止使用排他鎖和共享鎖

  • 共享鎖(SHARE) - 鎖定表,對記錄只讀不寫,多個用戶可以同時在同一個表上應用此鎖

  • 共享行排他(SHARE ROW EXCLUSIVE) – 比共享鎖更多的限制,禁止使用共享鎖及更高的鎖

  • 排他(EXCLUSIVE) – 限制最強的表鎖,僅允許其他用戶查詢該表的行。禁止修改和鎖定表

行級鎖

行鎖的劣勢:開銷大;加鎖慢;會出現死鎖
行鎖的優勢:鎖的粒度小,發生鎖衝突的概率低;處理併發的能力強
加鎖的方式:自動加鎖。對於UPDATE、DELETE和INSERT語句,InnoDB會自動給涉及數據集加排他鎖;對於普通SELECT語句,InnoDB不會加任何鎖;
當然我們也可以顯示的加鎖:
共享鎖:select * from tableName where … + lock in share more
排他鎖:select * from tableName where … + for update
InnoDB和MyISAM的最大不同點有兩個:一,InnoDB支持事務(transaction);二,默認採用行級鎖。加鎖可以保證事務的一致性,可謂是有人(鎖)的地方,就有江湖(事務);我們先簡單瞭解一下事務知識。

另外,MySQL的InnoDB下的三種行級鎖分類

  • 記錄鎖
  • 間隙鎖
  • 臨鍵鎖

頁級鎖

開銷和加鎖時間介於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發處理能力一般。

按鎖級別分類

共享鎖(S鎖)

共享鎖又稱爲讀鎖。即讀取操作時創建的鎖。其他用戶可以併發的讀取數據。
若事務T對數據A加上共享鎖,則事務T只能讀A; 其他事務也只能對數據A加共享鎖,而不能加排它鎖,直到事務T釋放A上的S鎖。

這就保證了其他事務可以讀A,但是在事務T釋放A上的共享鎖之前,不能對A做任何修改。

排他鎖(X鎖)

若事務T對數據對象A加上排它鎖,則只允許T讀取和修改數據A,其他任何事務都不能再對A加任何類型的鎖,直到事務T釋放X鎖。

它可以防止其他事務獲取資源上的鎖,直到事務末尾釋放鎖

按加鎖方式分類

自動鎖

在讀寫時數據庫自動加的鎖。

顯式鎖

通過命令加的鎖,可以看按粒度分類部分。已經寫了如何加顯式鎖。

按操作分類

DML鎖

DDL鎖

按使用方式分類

悲觀鎖

顧名思義,很悲觀,每次去讀寫數據的時候都認爲別人會修改,所以每次在讀寫數據的時候都會上鎖,這樣別人無法修改這個數據,直到它解鎖。

樂觀鎖

顧名思義,就是很樂觀,每次去讀寫數據的時候都認爲別人不會修改,所以,不會上鎖。但是在更新的時候會判斷一下在此期間別人有沒有更新這個數據,可以使用版本號等機制。

MVCC並不是樂觀鎖,InnoDB所實現的MVCC纔是樂觀鎖。
更嚴謹一點來說,樂觀鎖並不是一種具體的技術,樂觀鎖只是一種併發控制的思想

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