MySQL中的存儲引擎的鎖機制

前言
鎖機制是爲了解決數據庫的並行性和數據的一致性而產生的,通過爲訪問的數據加鎖,可以使得被訪問的數據不被修改,從而保證數據的有效性和一致性。

1、表級鎖:MyISAM 引擎
優點)開銷小,加鎖快,不會出現死鎖現象;
缺點)表級鎖範圍大,導致鎖的衝突概率最高,併發性最低;
使用)MyISAM執行查詢(SELECT)前和執行更新操作(UPDATE、DELETE、INSERT)前會自動的給被查詢的數據表加讀鎖 定和寫鎖定,是不需要用戶使用(LOCK TABLE)命令顯式鎖定的。

2、行級鎖:InnoDB 引擎
優點)行級鎖範圍小,導致鎖的衝突概率最小,併發性最好;
1. 回滾時少量更改即可。
2. 衝突低,可長時間鎖定。

缺點)鎖定的開銷大,加鎖慢;會出現死鎖;
1. 相比於頁級鎖和表級鎖,開銷大,佔用內存大。
2. 某些應用場景下,對錶的大部分使用行級鎖,會比較慢。

分類
1. 共享鎖(S)允許事物讀取數據記錄,並阻止其他事物獲得相同數據記錄的 排它鎖。
2. 排它鎖(X)允許事物更新數據記錄,並阻止其他事物獲得相同數據記錄的 共享讀鎖和排他寫鎖。

注意事項
InnoDB的行級鎖定是通過對索引項加鎖實現的,否則InnoDB使用的是表級鎖。

3、頁級鎖:DBD引擎(也支持表級鎖定)
(狀況)頁面鎖定的開銷和加鎖時間界於表級鎖定和行級鎖定之間;會出現死鎖;鎖定的粒度處於其他兩者之間,併發度一般。

4、函數鎖定:(不常見)
函數鎖定使用GET_LOCK(name, time), RELEASE_LOCK(name)函數進行行鎖定和釋放操作;

5、適用範圍
表級鎖:以查詢爲主,只有少量按索引條件更新數據的應用,如一些Web應用;
行級鎖:適用有大量按索引條件併發更新少量不同的數據,同時又有併發查詢的應用,如一些在線的事物處理系統;
函數鎖定:當只需要鎖定兩個進程之間的通信時,最好採用函數鎖定而不是LOCK/UNLOCK鎖定。

6、利用鎖進行性能優化
出現情況
讀鎖定與寫鎖定:當一個鎖被釋放後,鎖定會先分配給寫鎖定隊列,然後纔是讀鎖定隊列。也就是說,當數據庫擁有大量的更新操鎖時,查詢很難獲得讀鎖定,所以mysql的鎖機制可能會造成死鎖。

解決方法
1. 通過指定啓動參數low-priority-update,使得MyISAM存儲引擎給予讀鎖定請求優先權;
2. 通過執行命令SET LOW_PRIORITY_UPDATES=1,降低該進程的更新請求優先級;
3. 通過指定UPDATE、DELETE、INSERT等更新語句的LOW_PRIORITY屬性,降低優先級。
4. 爲適應更一般的情況,MySQL提供折中辦法調節讀寫衝突,即給系統參數max_write_lock_count設置一個合適的值,當一個數據表的寫鎖定達到該值的時,MySQL就暫時的把寫請求的優先級降低,這樣就可以在執行一定數量的寫鎖定後執行讀鎖定,以解決讀鎖定等待嚴重的問題。

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