mysql鎖系列之表鎖

基礎材料:

centos7.5  mysql 5.7.24


mysql表級別的鎖分爲兩類:表鎖和元數據鎖,兩者的加鎖形式上有所區別,元數據鎖由系統自動隱式添加,而表鎖需要手動顯式操作。前篇文章已經寫了關於元數據鎖的一些內容,本篇主要對錶鎖進行說明。

對於MyISAM這種不支持事務的引擎來講,支持的最小粒度的鎖就是表鎖。而innodb這種支持事務的引擎,在支持表鎖的同時,還支持更細粒度的行鎖。

表鎖的優勢在與不會因爲加鎖順序不同而產生死鎖,劣勢在於一次性將表資源全部鎖定併發度降低。

表鎖顯式語句加鎖爲共享鎖(S)和排他鎖(X),隱式DML操作加鎖爲意向共享鎖(IS),意向排他鎖(IX)。規則爲意向兼容,讀寫互斥。


如何加表鎖:

mysql> lock tables t1 read,t2 write;     #爲表t1加讀鎖、t2加寫鎖,中間用逗號隔開。

如何釋放表鎖:

1、mysql>unlock tables;

2、session斷開也會自動釋放表鎖

加表鎖後的限制:

當前執行加鎖命令的session只能按規則訪問lock tables列表中的表,並且不能訪問其他表。其他session能訪問加讀鎖的表並且不能寫,其他session不能訪問加寫鎖的表。

以上面的命令爲例,執行 lock tables t1 read,t2 write的session,只能讀t1,讀寫t2,不能寫t1,讀寫t1、t2外的其他表。如果嘗試讀寫test表會返回錯誤信息:ERROR 1100 (HY000): Table 'test' was not locked with LOCK TABLES,告訴你test表不在你的鎖定範圍之列。


表鎖實際也是由元數據鎖控制實現的:

例如在一張表執行lock tables testok write; 觀察metadata_locks結果如下:

與其他DDL語句一樣,也要層層加鎖,最終在表上加元數據排他鎖,達到鎖表的目的。

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