爲什麼要用鎖?
你在試衣間試衣服,沒有鎖,別人就會推門進來,場面會很尷尬!!!
什麼是鎖?
- 鎖是計算機協調多個進程或線程併發訪問某一資源的機制;
- 在數據庫中,數據也是一種供許多用戶共享的資源。如何保證數據併發訪問的一致性、有效性是所有數據庫必須解決的一個問題,鎖衝突也是影響數據庫併發訪問性能的一個重要因素;
- 鎖對數據庫而言顯得尤其重要,也更加複雜。
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