MySQL鎖
相對於其他的數據庫而言,MySQL的鎖機制比較簡單,最顯著的特點就是不同的存儲引擎支持不同的鎖機制。根據不同的存儲引擎,MySQL中鎖的特性可以大致歸納如下:
MyISAM:只支持表鎖;
BDB:支持表鎖和頁鎖;
InnoDB:支持行鎖和和表鎖;
開銷、加鎖速度、死鎖、粒度、併發性能
- 表鎖: 開銷小,加鎖快;不會出現死鎖;鎖定力度大,發生鎖衝突概率高,併發度最低
- 行鎖: 開銷大,加鎖慢;會出現死鎖;鎖定粒度小,發生鎖衝突的概率低,併發度高
- 頁鎖: 開銷和加鎖速度介於表鎖和行鎖之間;會出現死鎖;鎖定粒度介於表鎖和行鎖之間,併發度一般
從上述的特點課件,很難籠統的說哪種鎖最好,只能根據具體應用的特點來說哪種鎖更加合適。僅僅從鎖的角度來說的話:
表鎖更適用於以查詢爲主,只有少量按索引條件更新數據的應用;行鎖更適用於有大量按索引條件併發更新少量不同數據,同時又有併發查詢的應用。(PS:由於BDB已經被InnoDB所取代,我們只討論MyISAM表鎖和InnoDB行鎖的問題)
可以通過檢查table_locks_waited和table_locks_immediate狀態變量來分析系統上的表鎖定爭奪:
mysql> show status like 'table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Table_locks_immediate | 2979 |
| Table_locks_waited | 0 |
+-----------------------+-------+
2 rows in set (0.00 sec))
如果Table_locks_waited的值比較高,則說明存在着較嚴重的表級鎖爭用情況。
獲得表film_text的WRITE鎖定
mysql> lock table film_text write;
Query OK, 0 rows affected (0.00 sec)
釋放鎖:
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)