1. 程式人生 > 其它 >Mysql讀寫鎖保姆級圖文教程

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表的讀操作(加讀鎖),會阻塞其他執行緒對同一表的讀和寫操作,只有當寫鎖釋放後,才會執行其他程序的讀寫操作。

簡而言之,就是讀鎖會阻塞寫,但是不會阻塞讀,而寫鎖會把杜希俄都阻塞。

點選關注,第一時間瞭解華為雲新鮮技術~