目錄
介紹
表鎖
語法
特點
元數據鎖
介紹
演示
意向鎖?
介紹
分類
演示?
介紹
表級鎖,每次操作鎖住整張表。鎖定粒度大,發生鎖沖突的概率最高,并發度最低。應用在MyISAM、InnoDB、BDB等存儲引擎中。
對于表級鎖,主要分為以下三類:
- 表鎖
- 元數據鎖(meta data lock,MDL)
- 意向鎖
表鎖
對于表鎖,分為兩類:
- 表共享讀鎖(read lock)
- 表獨占寫鎖(write lock)
語法
- 加鎖:lock tables 表名... read/write。
- 釋放鎖:unlock tables / 客戶端斷開連接 。
特點
A.讀鎖
左側為客戶端一,對指定表加了讀鎖,不會影響右側客戶端二的讀,但是會阻塞右側客戶端的寫。
測試:
?
B.寫鎖?
?左側為客戶端一,對指定表加了寫鎖,會阻塞右側客戶端的讀和寫。
測試:
結論:讀鎖不會阻塞其他客戶端的讀,但是會阻塞寫。寫鎖既會阻塞其他客戶端的讀,又會阻塞其他客戶端的寫。
元數據鎖
介紹
meta data lock , 元數據鎖,簡寫MDL。
MDL加鎖過程是系統自動控制,無需顯式使用,在訪問一張表的時候會自動加上。MDL鎖主要作用是維護表元數據的數據一致性,在表上有活動事務的時候,不可以對元數據進行寫入操作。
為了避免DML與DDL沖突,保證讀寫的正確性。這里的元數據,可以簡單理解為就是一張表的表結構。 也就是說,某一張表涉及到未提交的事務時,是不能夠修改這張表的表結構的。
在MySQL5.5中引入了MDL,當對一張表進行增刪改查的時候,加MDL讀鎖(共享);
當對表結構進行變更操作的時候,加MDL寫鎖(排他)。
常見的SQL操作時,所添加的元數據鎖:
對應SQL | 鎖類型 | 說明 |
---|---|---|
lock tables xxx read / write | SHARED_READ_ONLY / SHARED_NO_READ_WRITE | |
select 、 select ... lock in share mode | SHARED_READ | 與 SHARED_READ、 SHARED_WRITE兼容,與EXCLUSIVE互斥 |
insert 、update、delete、select ... for update | SHARED_WRITE | 與SHARED_READ、SHARED_WRITE兼容,與EXCLUSIVE互斥 |
alter table ... | EXCLUSIVE | 與其他的 MDL 都互斥 |
演示
當執行SELECT、INSERT、UPDATE、DELETE等語句時,添加的是元數據共享鎖(SHARED_READ /SHARED_WRITE),之間是兼容的。?
當執行SELECT語句時,添加的是元數據共享鎖(SHARED_READ),會阻塞元數據排他鎖(EXCLUSIVE),之間是互斥的。?
?我們可以通過下面的SQL,來查看數據庫中的元數據鎖的情況:
select object_type,object_schema,object_name,lock_type,lock_duration from
performance_schema.metadata_locks ;
我們在操作過程中,可以通過上述的SQL語句,來查看元數據鎖的加鎖情況。
意向鎖?
介紹
為了避免DML在執行時,加的行鎖與表鎖的沖突,在InnoDB中引入了意向鎖,使得表鎖不用檢查每行數據是否加鎖,使用意向鎖來減少表鎖的檢查。
假如沒有意向鎖,客戶端一對表加了行鎖后,客戶端二如何給表加表鎖呢,來通過示意圖簡單分析一下:
首先客戶端一,開啟一個事務,然后執行DML操作,在執行DML語句時,會對涉及到的行加鎖。
當客戶端二,想對這張表加表鎖時,會檢查當前表是否有對應的行鎖,如果沒有,則添加表鎖,此時就會從第一行數據,檢查到最后一行數據,效率較低。?
有了意向鎖之后,?
客戶端一,在執行DML操作時,會對涉及的行加行鎖,同時也會對該表加上意向鎖。
而其他客戶端,在對這張表加表鎖的時候,會根據該表上所加的意向鎖來判定是否可以成功加表鎖,而不用逐行判斷行鎖情況了。
分類
- 意向共享鎖(IS): 由語句select ... lock in share mode添加 。 與 表鎖共享鎖(read)兼容,與表鎖排他鎖(write)互斥。
- 意向排他鎖(IX): 由insert、update、delete、select...for update添加 。與表鎖共享鎖(read)及排他鎖(write)都互斥,意向鎖之間不會互斥。
一旦事務提交了,意向共享鎖、意向排他鎖,都會自動釋放。
可以通過以下SQL,查看意向鎖及行鎖的加鎖情況:
select object_schema,object_name,index_name,lock_type,lock_mode,lock_data from
performance_schema.data_locks;
演示?
A. 意向共享鎖與表讀鎖是兼容的
B. 意向排他鎖與表讀鎖、寫鎖都是互斥的?
?
END?
學習自:黑馬程序員——MySQL數據庫課程