MyISAM 和 InnoDB 鎖總結

爲什麼要用鎖?

你在試衣間試衣服,沒有鎖,別人就會推門進來,場面會很尷尬!!!

什麼是鎖?

  1. 鎖是計算機協調多個進程或線程併發訪問某一資源的機制;
  2. 在數據庫中,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素;
  3. 鎖對數據庫而言顯得尤其重要,也更加複雜。

Mysql 中的鎖?

  • 表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖衝突的概率最高,併發度最低;
  • 行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖衝突的概率最低,併發度也最高;
  • 頁鎖:開銷和加鎖時間界於表鎖和行鎖之間;會出現死鎖;鎖定粒度界於表鎖和行鎖之間,併發度一般。

鎖的使用場景?

  • 表級鎖更適合於以查詢爲主,只有少量按索引條件更新數據的應用,可以考慮使用MyISAM鎖;
  • 行級鎖則更適合於有大量按索引條件併發更新少量不同數據,同時又有併發查詢的應用,可以考慮使用InnoDB鎖.

MyISAM 鎖-- 表級鎖

MySQL 的表級鎖有兩種模式:

  • 表共享讀鎖(Table Read Lock)
  • 表獨佔寫鎖(Table Write Lock)
  None(無鎖時) 讀鎖 寫鎖
讀鎖
寫鎖

 

  讀鎖 寫鎖
同session

讀當前被鎖表:可讀

讀當前被鎖表別名表: 報錯

寫當前被鎖表:報錯

讀其他表:報錯

寫其他表:報錯

讀當前被鎖表:報錯

讀當前被鎖表別名表: 報錯

寫當前被鎖表:可寫

讀其他表:報錯

寫其他表:報錯

不同session

讀當前被鎖表:可讀

寫當前被鎖表:等待

讀其他表:可讀

寫其他表:可寫

讀當前被鎖表:等待

寫當前被鎖表:等待

讀其他表:可讀

寫其他表:可寫

InnoDB 鎖--行級鎖

注:必須有索引才能實現,否則會自動鎖全表!!!

  讀鎖 寫鎖
同session

可讀

可寫

id= 1加寫鎖

不同session

可讀

允許讀

寫id= 1的數據,等待

寫id != 1的數據,可寫

寫 非索引列查詢條件數據,等待

加鎖

可加讀鎖

不可加任何鎖

 

如何釋放鎖?

執行Begin,commit,或者rollback

 

 

 

 

 

 

 

 

 

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