Mysql讀寫鎖保姆級圖文教程
摘要:讀鎖會阻塞寫,但是不會阻塞讀,而寫鎖會把杜希俄都阻塞。
本文分享自華為雲社區《Mysql保姆級讀寫鎖圖文教程丨【綻放吧!資料庫】》,作者:Code皮皮蝦 。
準備
創建mylock表 CREATE TABLE `mylock` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 【手動增加表鎖】 lock table 表名字1 read(write),表名字2 read(write),其它; 【查看錶上加過的鎖】 show open tables; 【釋放表鎖】unlock tables;
讀鎖
讀鎖(共享鎖):針對同一份數據,多個讀操作可以同時進行而不會互相影響。
共享鎖又稱為讀鎖,簡稱S鎖,顧名思義,共享鎖就是多個事務對於同一數據可以共享一把鎖,都能訪問到數據,但是只能讀不能修改。
1.運行show open tables,可見In_use全為0即沒有加過鎖,為1表示有鎖。
2.運行lock table mylock read,lagou write加鎖後,show open tables可見加鎖成功。
3.開啟兩個查詢,在session1加讀鎖lock table mylock read
都可查詢成功。
4.在session2讀任何錶都不會受影響
5.在session1中查詢其他表或更新表都不行。
6.在session2中更新表,則會阻塞。
寫鎖
寫鎖(排它鎖):當前寫操作沒有完成前,它會阻斷其他寫鎖和讀鎖。
排他鎖又稱為寫鎖,簡稱X鎖,顧名思義,排他鎖就是不能與其他所並存,如一個事務獲取了一個數據行的排他鎖,其他事務就不能再獲取該行的其他鎖,包括共享鎖和排他鎖,但是獲取排他鎖的事務是可以對數據就行讀取和修改。
先unlock tables釋放鎖,再在session1運行lock table mylock write加寫鎖
1.在session1中更新成功
但查詢失敗
2.在session2中查詢會阻塞
總結
Mylsam在執行查詢語句(select)前,會自動涉及的所有表加讀鎖,在執行增刪改操作前,會自動給涉及的表加寫鎖。
MYSQL的表級鎖有兩種模式:
1.表共享讀鎖(Table Read Lock)
2.表共享寫鎖(Table Write Lock)
結論:
1、對MyLSAM表的讀操作(加讀鎖),不會阻塞其他執行緒對同一表的讀請求,但會阻塞對同一表的寫請求,只有當讀鎖釋放後,才會執行其他進程的寫操作。
2、對MyLSAM表的讀操作(加讀鎖),會阻塞其他執行緒對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他進程的讀寫操作。
簡而言之,就是讀鎖會阻塞寫,但是不會阻塞讀,而寫鎖會把杜希俄都阻塞。