MySQL鎖
爲了保證數據的一致完整性,任何一個數據庫都存在鎖定機制。鎖定機制的優劣直接影響到一個數據庫系統的併發處理能力和性能,所以鎖定機制的實現也就成爲了各種數據庫的核心技術之一
三種不同的鎖類型
名稱 | 粒度 | 併發能力 | 加鎖和釋放鎖的消耗 | 出現死鎖概率 |
---|---|---|---|---|
row-level | 最小 | 最大 | 消耗大 | 高 |
page-level | 中 | 中 | 中 | 中 |
table-level | 最大 | 比較弱 | 消耗小 | 低 |
鎖機制分析
表級鎖定
使用了:read、read_wait、write、write_wait四個隊列實現
使用方法 : lock table my_table read、lock table my_table write;
行級鎖定
這裏主要說下InnoDB使用了"間隙鎖",也就是,根據鎖定大是一個範圍。
具體可以參考【間隙鎖產生的原因】
鎖優化
目標就是,縮短鎖定的時間。
-
合理設計索引,避免因爲間隙鎖,而影響到其他Query
-
能者多勞,搜索的時候儘可能使用索引,並且索引範圍儘可能小,避免因爲無法使用索引加鎖而變成表鎖
-
業務層面,在同一個事務中,儘可能做到一次鎖定需要的所有資源,減少死鎖產生的概率;
-
對於非常容易產生死鎖的業務部分,可以嘗試使用升級鎖定顆粒度,通過表級鎖定來減少死鎖產生的概率。
其他
這裏補充下InnoDB 的優點
-
支持事務安全:READ UNCOMMITTED、READ COMMITTED、REPEATABLE和SERIALIZABLE
-
鎖定機制的改進
參考文章
瞭解下Mysql的間隙鎖及產生的原因
參考書籍<<MySQL性能調優和架構設計>>