8、MySQL表锁、行锁和页锁
MySQL 按鎖的粒度可以細分為行級鎖、頁級鎖和表級鎖。
我們可以將鎖粒度理解成鎖范圍。
1)表級鎖(table lock)
表級鎖為表級別的鎖定,會鎖定整張表,可以很好的避免死鎖,是 MySQL 中最大顆粒度的鎖定機制。
一個用戶在對表進行寫操作(插入、刪除、更新等)時,需要先獲得寫鎖,這會阻塞其它用戶對該表的所有讀寫操作。沒有寫鎖時,其它讀取的用戶才能獲得讀鎖,讀鎖之間是不相互阻塞的。
表級鎖最大的特點就是實現邏輯非常簡單,帶來的系統負面影響最小。所以獲取鎖和釋放鎖的速度很快。當然,鎖定顆粒度大帶來最大的負面影響就是出現鎖定資源爭用的概率會很高,致使并發度大打折扣。
不過在某些特定的場景中,表級鎖也可以有良好的性能。例如,READ LOCAL 表級鎖支持某些類型的并發寫操作。另外,寫鎖也比讀鎖有更高的優先級,因此一個寫鎖請求可能會被插入到讀鎖隊列的前面(寫鎖可以插入到鎖隊列中讀鎖的前面,反之讀鎖則不能插入到寫鎖的前面)。
使用表級鎖的主要是 MyISAM,MEMORY,CSV 等一些非事務性存儲引擎。
盡管存儲引擎可以管理自己的鎖,MySQL 本身還是會使用各種有效的表級鎖來實現不同的目的。例如,服務器會為諸如 ALTER TABLE 之類的語句使用表級鎖,而忽略存儲引擎的鎖機制。
2)頁級鎖(page lock)
頁級鎖是 MySQL 中比較獨特的一種鎖定級別,在其他數據庫管理軟件中并不常見。
頁級鎖的顆粒度介于行級鎖與表級鎖之間,所以獲取鎖定所需要的資源開銷,以及所能提供的并發處理能力同樣也是介于上面二者之間。另外,頁級鎖和行級鎖一樣,會發生死鎖。
頁級鎖主要應用于 BDB 存儲引擎。
3)行級鎖(row lock)
行級鎖的鎖定顆粒度在 MySQL 中是最小的,只針對操作的當前行進行加鎖,所以行級鎖發生鎖定資源爭用的概率也最小。
行級鎖能夠給予應用程序盡可能大的并發處理能力,從而提高需要高并發應用系統的整體性能。雖然行級鎖在并發處理能力上面有較大的優勢,但也因此帶來了不少弊端。
由于鎖定資源的顆粒度很小,所以每次獲取鎖和釋放鎖需要做的事情也就更多,帶來的消耗自然也就更大。此外,行級鎖也最容易發生死鎖。所以說行級鎖最大程度地支持并發處理的同時,也帶來了最大的鎖開銷。
行級鎖主要應用于 InnoDB 存儲引擎。
隨著鎖定資源顆粒度的減小,鎖定相同數據量的數據所需要消耗的內存數量也越來越多,實現算法也會越來越復雜。不過,隨著鎖定資源顆粒度的減小,應用程序的訪問請求遇到鎖等待的可能性也會隨之降低,系統整體并發度也會隨之提升。
MySQL 這 3 種鎖的特性可大致歸納如下:
從上述特點可見,很難籠統的說哪種鎖更好,只能具體應用具體分析。
從鎖的角度來說,表級鎖適合以查詢為主,只有少量按索引條件更新數據的應用,如 Web 應用。而行級鎖更適合于有大量按索引條件,同時又有并發查詢的應用,如一些在線事務處理(OLTP)系統。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的8、MySQL表锁、行锁和页锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 7、 MySQL锁机制:数据库核心技术之
- 下一篇: 9、 InnoDB行锁