MySQL性能調優與架構設計(六)—— MySQL數據庫鎖定機制

前言

  1. 在說鎖定機制之前,有必要理解下併發與並行的基本概念。
  2. 併發是指一臺處理器上同時處理多個任務,並行是指多個處理器同時處理多個任務,如hadoop分佈式集羣。
  3. 通俗的講,併發就是不同線程同時幹一件事情,並行就是不同線程同時幹不同的事情。
  4. 所以併發編程的目標是充分的利用處理器的每一個核,以達到最高的性能。
  5. 那麼併發必然會牽扯到應用系統中資源的競爭。
  6. 詳細的關於並行與併發可以參考一篇文章來理解:https://blog.csdn.net/qq_3329...
  7. 在高併發的情況下,爲了保證數據的完整一致性,任何一個數據庫都有鎖定機制。
  8. 鎖定機制的優劣直接影響了一個數據庫的併發處理能力和性能。
  9. 本章將對mysql中兩種使用最爲頻繁的存儲引擎MyISAM和InnoDB各自的鎖定機制進行較爲詳細的分析。

MySQL鎖定機制簡介

  1. 數據庫鎖定機制簡單來說就是數據庫爲了保證數據的一致性而使各種共享資源在被併發訪問變得有序所設計的一種規則。
  2. 對於任何一種數據庫來說都需要有相應的鎖定機制,所以MySQL自然也不例外。
  3. MySQL數據庫由於其自身架構的特點,存在多種數據存儲引擎,每種存儲引擎所針對的應用場景特點都不太一樣,爲了滿足各自特定應用場景的需求,每種存儲引擎的鎖定機制都是爲各自所面對的特定場景而優化設計,所以,各種存儲引擎的鎖定機制也有較大區別。
  4. 總的來說,MySQL各存儲引擎使用了三種類型(級別)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。

行級鎖定(row-level)

  1. 行級鎖,一般是指排它鎖,即被鎖定行不可進行修改、刪除,只可以被其他會話select。
  2. 排他鎖又稱爲寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他鎖並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖。
  3. 行級鎖定最大的特點就是鎖定對象的顆粒度很小,也是目前各大數據庫管理軟件所實現的鎖定顆粒度最小的。
  4. 由於鎖定顆粒度很小,所以發生鎖定資源競爭的概率也小,能夠給予應用程序儘可能大的併發處理能力提高一些需要高併發應用系統的整體性能。
  5. 雖然在併發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。
  6. 由於鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也很多,帶來的消耗自然也就更大了。
  7. 此外,行級鎖定也最容易發生死鎖。

表級鎖定(table-level)

  1. 表級鎖,直接鎖定整張表,在你鎖定期間,其他進程無法對該表進行寫操作。如果你是寫鎖,則其他進程則讀也不允許。
  2. 和行級鎖定相反,表級別的鎖定是mysql各存儲引擎中最大顆粒度的鎖定機制。
  3. 該鎖定機制最大的特點就是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。
  4. 由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。
  5. 當然,鎖定顆粒度大帶來的負面影響就是出現資源爭用的概率也會很高,致使併發度大打折扣。

頁級鎖定(page-level)

  1. 頁級鎖定是MySQL中比較獨特的一種鎖定級別,在其他數據庫管理軟件中也並不是太常見。
  2. 頁級鎖定的特點是鎖定顆粒度介於行級鎖定和表級鎖定之間,所以獲取鎖所需要的資源開銷,以及所能提供的併發處理能力也同樣介於上面二者之間。
  3. 另外,頁級鎖定和行級鎖定一樣,也會發生死鎖。

小結

  1. 在數據庫實現資源鎖定的過程中,隨着鎖定資源顆粒度的減小,鎖定相同數據量的數據所需要消耗的內存數量是越來越多,實現算法也會越來越複雜。
  2. 隨着鎖定資源顆粒度的減小,應用程序的訪問請求遇到鎖等待的可能性也會隨之降低,系統整體併發度頁隨之提升。
  3. 在MySQL中,使用表級鎖定的是MyISAM、MEmory、CSv等一些非事務型存儲引擎,而使用行級鎖的主要是InnoDB存儲引擎和NDB Cluster存儲引擎,頁級鎖定主要是BerkeleyDB存儲引擎的鎖定方式。

參考鏈接

https://www.cnblogs.com/jesse...

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