△MyISAM和InnoDB存儲引擎使用的鎖:
MyISAM採用表級鎖(table-level locking)。
InnoDB支持行級鎖(row-level locking)和表級鎖,默認爲行級鎖算法
△表級鎖和行級鎖對比:數據庫
表級鎖: MySQL中鎖定 粒度最大 的一種鎖,對當前操做的整張表加鎖,實現簡單,資源消耗也比較少,加鎖快,不會出現死鎖。其鎖定粒度最大,觸發鎖衝突的機率最高,併發度最低,MyISAM和 InnoDB引擎都支持表級鎖。
行級鎖: MySQL中鎖定 粒度最小 的一種鎖,只針對當前操做的行進行加鎖。 行級鎖能大大減小數據庫操做的衝突。其加鎖粒度最小,併發度高,但加鎖的開銷也最大,加鎖慢,會出現死鎖。併發
△InnoDB存儲引擎的鎖的算法有三種:
Record lock:單個行記錄上的鎖
Gap lock:間隙鎖,鎖定一個範圍,不包括記錄自己
Next-key lock:record+gap 鎖定一個範圍,包含記錄自己設計
△相關知識點:
1.innodb對於行的查詢使用next-key lock
2.Next-locking keying爲了解決Phantom Problem幻讀問題
3.當查詢的索引含有惟一屬性時,將next-key lock降級爲record key
4.Gap鎖設計的目的是爲了阻止多個事務將記錄插入到同一範圍內,而這會致使幻讀問題的產生
5.有兩種方式顯式關閉gap鎖:(除了外鍵約束和惟一性檢查外,其他狀況僅使用record lock) A. 將事務隔離級別設置爲RC B. 將參數innodb_locks_unsafe_for_binlog設置爲1索引