MySQL效能調優與架構設計(六)—— MySQL資料庫鎖定機制
阿新 • • 發佈:2019-02-01
前言
- 在說鎖定機制之前,有必要理解下併發與並行的基本概念。
- 併發是指一臺處理器上同時處理多個任務,並行是指多個處理器同時處理多個任務,如hadoop分散式叢集。
- 通俗的講,併發就是不同執行緒同時幹一件事情,並行就是不同執行緒同時幹不同的事情。
- 所以併發程式設計的目標是充分的利用處理器的每一個核,以達到最高的效能。
- 那麼併發必然會牽扯到應用系統中資源的競爭。
- 在高併發的情況下,為了保證資料的完整一致性,任何一個數據庫都有鎖定機制。
- 鎖定機制的優劣直接影響了一個數據庫的併發處理能力和效能。
- 本章將對mysql中兩種使用最為頻繁的儲存引擎MyISAM和InnoDB各自的鎖定機制進行較為詳細的分析。
MySQL鎖定機制簡介
- 資料庫鎖定機制簡單來說就是資料庫為了保證資料的一致性而使各種共享資源在被併發訪問變得有序所設計的一種規則。
- 對於任何一種資料庫來說都需要有相應的鎖定機制,所以MySQL自然也不例外。
- MySQL資料庫由於其自身架構的特點,存在多種資料儲存引擎,每種儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以,各種儲存引擎的鎖定機制也有較大區別。
- 總的來說,MySQL各儲存引擎使用了三種類型(級別)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。
行級鎖定(row-level)
- 行級鎖,一般是指排它鎖,即被鎖定行不可進行修改、刪除,只可以被其他會話select。
- 排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他鎖並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖。
- 行級鎖定最大的特點就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。
- 由於鎖定顆粒度很小,所以發生鎖定資源競爭的概率也小,能夠給予應用程式儘可能大的併發處理能力提高一些需要高併發應用系統的整體效能。
- 雖然在併發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。
- 由於鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也很多,帶來的消耗自然也就更大了。
- 此外,行級鎖定也最容易發生死鎖。
表級鎖定(table-level)
- 表級鎖,直接鎖定整張表,在你鎖定期間,其他程序無法對該表進行寫操作。如果你是寫鎖,則其他程序則讀也不允許。
- 和行級鎖定相反,表級別的鎖定是mysql各儲存引擎中最大顆粒度的鎖定機制。
- 該鎖定機制最大的特點就是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。
- 由於表級鎖一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。
- 當然,鎖定顆粒度大帶來的負面影響就是出現資源爭用的概率也會很高,致使併發度大打折扣。
頁級鎖定(page-level)
- 頁級鎖定是MySQL中比較獨特的一種鎖定級別,在其他資料庫管理軟體中也並不是太常見。
- 頁級鎖定的特點是鎖定顆粒度介於行級鎖定和表級鎖定之間,所以獲取鎖所需要的資源開銷,以及所能提供的併發處理能力也同樣介於上面二者之間。
- 另外,頁級鎖定和行級鎖定一樣,也會發生死鎖。
小結
- 在資料庫實現資源鎖定的過程中,隨著鎖定資源顆粒度的減小,鎖定相同資料量的資料所需要消耗的記憶體數量是越來越多,實現演算法也會越來越複雜。
- 隨著鎖定資源顆粒度的減小,應用程式的訪問請求遇到鎖等待的可能性也會隨之降低,系統整體併發度頁隨之提升。
- 在MySQL中,使用表級鎖定的是MyISAM、MEmory、CSv等一些非事務型儲存引擎,而使用行級鎖的主要是InnoDB儲存引擎和NDB Cluster儲存引擎,頁級鎖定主要是BerkeleyDB儲存引擎的鎖定方式。