1.引入
上一節課,我們呢,查看了在對一個表添加讀鎖,然後在不同的會話中查看對數據的不同操作,可以發現讀鎖在讀取的時候可以共享數據,寫的時候阻塞。那麼下面呢。我們就一起來看看添加寫鎖又會有什麼樣子的變化呢?
2.寫鎖案例講解
(1).數據庫表內容準備
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(10) NOT NULL,
`password` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=myisam DEFAULT CHARSET=utf8;
//注意這一個數據表的引擎是myisam
添加數據內容並查看
(2).給數據庫表admin添加一個寫鎖(在會話1中)
lock table admin write;
(3).操作數據庫表內容
會話1中進行對加鎖數據表的讀取操作,發現可以讀取。
在會話1中進行對加鎖數據表修改操作,發現可以進行操作。
在會話1中去讀取其他數據表的內容,發現不可以,因爲加鎖的數據庫表的棧沒有清除。
會話2讀取其他數據表內容,發現可以讀取。
會話2讀取加鎖數據庫表內容,發現處於阻塞狀態,然後在會話1中取消加鎖,立刻執行查詢操作。
會話2進行其他操作的時候都不能夠進行其他的操作。
3.總結
通過上面的操作,我們可以把讀鎖和寫鎖的操作總結如下:
讀鎖會阻塞寫,但是不會堵塞讀取操作。寫鎖會把讀操作和寫操作都堵塞。
4.讀寫鎖的其他相關操作
(1).查看哪些被加了鎖
show open tables;
//有1的就是被加了鎖。
(2).如何分析表鎖定
可以通過檢查table_locks_waited 和table_locks_immediate狀態變量來分析系統上的表鎖定。
SQL:show status like 'table%';
由於我們的admin數據庫表使用是是Myisam引擎,那麼Myisam的讀寫調度是寫優先,這也就是Myisam不適合作爲寫爲主的主表的引擎,因爲添加寫鎖以後,其他的線程不能夠做任何的操作,大量的更新會使得查詢很難得到鎖,進而造成永遠阻塞。