這篇文章帶給大家的內容是關於 MySQL資料庫鎖定機制的介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有幫助。
MySQL鎖定機制簡介
資料庫鎖定機制簡單來說就是資料庫為了保證資料的一致性而使各種共享資源在被並發存取變得有序所設計的一種規則。
對於任何一種資料庫來說都需要有對應的鎖定機制,所以MySQL自然也不例外。
MySQL資料庫由於其自身架構的特點,存在多種資料儲存引擎,每個儲存引擎所針對的應用場景特點都不太一樣,為了滿足各自特定應用場景的需求,每種儲存引擎的鎖定機制都是為各自所面對的特定場景而優化設計,所以,各種儲存引擎的鎖定機制也有較大差異。
總的來說,MySQL各儲存引擎使用了三種類型(層級)的鎖定機制:行級鎖定,頁級鎖定和表級鎖定。
行級鎖定(row-level)
#行級鎖,一般是指排它鎖,即被鎖定行不可進行修改、刪除,只可以被其他會話select。
排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他鎖並存,如一個事務獲取了一個資料行的排他鎖,其他事務就不能再取得該行的其他鎖。
行級鎖定最大的特色就是鎖定物件的顆粒度很小,也是目前各大資料庫管理軟體所實現的鎖定顆粒度最小的。
由於鎖定顆粒度很小,所以發生鎖定資源競爭的機率也小,能夠給予應用程式盡可能大的並發處理能力提高一些需要高並發應用系統的整體性能。
雖然在並發處理能力上面有較大的優勢,但是行級鎖定也因此帶來了不少弊端。
由於鎖定資源的顆粒度很小,所以每次取得鎖和釋放鎖需要做的事情也很多,帶來的消耗自然也就更大了。
此外,行級鎖定也最容易發生死鎖。
表級鎖定(table-level)
表級鎖,直接鎖定整張表,在你在鎖定期間,其他進程無法對該表進行寫入操作。如果你是寫鎖,則其他程序則讀也不允許。
和行級鎖定相反,表格層級的鎖定是mysql各儲存引擎中最大顆粒度的鎖定機制。
此鎖定機制最大的特色就是實作邏輯非常簡單,帶來的系統負向影響最小。所以取得鎖和釋放鎖的速度很快。
由於表級鎖定一次會將整個表鎖定,所以可以很好的避免困擾我們的死鎖問題。
當然,鎖定顆粒度大帶來的負面影響就是出現資源爭用的機率也會很高,致使並發度大打折扣。
頁級鎖定(page-level)
#頁級鎖定是MySQL中比較獨特的一種鎖定級別,在其他資料庫管理軟體中也不是太常見。
頁級鎖定的特點是鎖定顆粒度介於行級鎖定和表級鎖定之間,所以取得鎖定所需的資源開銷,以及所能提供的並發處理能力也同樣介於上面二者之間。
另外,頁級鎖定和行級鎖定一樣,也會發生死鎖。
小結
#在資料庫實作資源鎖定的過程中,隨著鎖定資源顆粒度的減少,鎖定相同資料量的資料所需消耗的記憶體數量是越來越多,實作演算法也會越來越複雜。
隨著鎖定資源顆粒度的減小,應用程式的存取請求遇到鎖定等待的可能性也會隨之降低,系統整體並發度頁隨之提升。
在MySQL中,使用表級鎖定的是MyISAM、MEmory、CSv等一些非事務型儲存引擎,而使用行級鎖定的主要是InnoDB儲存引擎和NDB Cluster存儲引擎,頁級鎖定主要是BerkeleyDB儲存引擎的鎖定方式。
以上是MySQL資料庫鎖定機制的介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!