Mysql共享鎖 排他鎖

2021-10-08 04:15:22 字數 2840 閱讀 9254

我之前專程寫了mysql中myisam和innodb區別

和mysql儲存引擎

這裡主要寫一些影響鎖相關的內容

mysql 在5.5之前預設使用 myisam 儲存引擎,之後使用 innodb 。檢視當前儲存引擎:

show variables like '%storage_engine%';
myisam 運算元據都是使用的表鎖,你更新一條記錄就要鎖整個表,導致效能較低,併發不高。當然同時它也不會存在死鎖問題。

而 innodb 與 myisam 的最大不同有兩點:一是 innodb 支援事務;二是 innodb 採用了行級鎖。也就是你需要修改哪行,就可以只鎖定哪行。

在 mysql 中,行級鎖並不是直接鎖記錄,而是鎖索引。索引分為主鍵索引和非主鍵索引兩種,如果一條sql 語句操作了主鍵索引,mysql 就會鎖定這條主鍵索引;如果一條語句操作了非主鍵索引,mysql會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。

innodb 行鎖是通過給索引項加鎖實現的,如果沒有索引,innodb 會通過隱藏的聚簇索引來對記錄加鎖。也就是說:如果不通過索引條件檢索資料,那麼innodb將對錶中所有資料加鎖,實際效果跟表鎖一樣。因為沒有了索引,找到某一條記錄就得掃瞄全表,要掃瞄全表,就得鎖定表。

資料庫的增刪改操作預設都會加排他鎖,而查詢不會加任何鎖。

mysql innodb引擎預設的修改資料語句,update,delete,insert都會自動給涉及到的資料加上排他鎖select語句預設不會加任何鎖型別,如果加排他鎖可以使用select …for update語句,加共享鎖可以使用select … lock in share mode語句。所以加過排他鎖的資料行在其他事務種是不能修改資料的,也不能通過for update和lock in share mode鎖的方式查詢資料,但可以直接通過select …from…查詢資料,因為普通查詢沒有任何鎖機制。

對某一資源加共享鎖,自身可以讀該資源,其他人也可以讀該資源(也可以再繼續加共享鎖,即 共享鎖可多個共存),但無法修改。要想修改就必須等所有共享鎖都釋放完之後。語法為:

select * from table lock in share mode
對某一資源加排他鎖,自身可以進行增刪改查,其他人無法進行任何操作。語法為:

select * from table for update
排他鎖和共享鎖 只會對加鎖的sql語句進行阻塞

例如a事務:

start transaction;

select * from table_name where id = 1 for update;

b事務

# 不會阻塞 直接查出答案

select * from table_name where id = 1

c事務

# 阻塞 等待事務a提交

select * from table_name where id = 1 for update;

當我們用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內但不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖,這種鎖機制就是所謂的間隙鎖(next-key)鎖。

上面的文字很抽象,現在舉個栗子,介紹間隙鎖是怎麼產生的:

假設有以下表t_student:

idname

***address1a

0cq3b

1cq4c

0cq5d

1cq6e

0cq這個時候我們發出一條這樣的加鎖sql語句:

start transaction;

select id,name from t_student where id > 0 and id < 5 for update;

這時候,我們命中的資料為以下加粗部分:

idname

***address

1a0cq

3b1cq

4c0cq5d

1cq6e

0cq細心的朋友可能就會發現,這裡缺少了條id為2的記錄,我們的重點就在這裡。

select ... for update這條語句,是會對資料記錄加鎖的,這裡因為命中了索引,加的是行鎖。從資料記錄來看,這裡排它鎖鎖住資料是id為1、3和4的這3條資料。

但是,看看前面我們的介紹——對於鍵值在條件範圍內但不存在的記錄,叫做「間隙(gap)」,innodb也會對這個「間隙」加鎖。

好了,我們這裡,鍵值在條件範圍但是不存在的記錄,就是id為2的記錄,這裡會對id為2資料加上間隙鎖。假設這時候如果有id=2的記錄insert進來了,是要等到這個事務結束以後才會執行的

總的來說,有2個作用:防止幻讀和防止資料誤刪/改

因為加鎖了,所以其他(刪/改/增)都會被阻塞

最大的隱患就是效能問題

如果間隙鎖出現死鎖的情況下,會更隱晦,更難定位

MySQL 共享排他鎖 mysql 共享排他鎖

1 基礎知識 共享鎖又叫s鎖 share locks 共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又叫x鎖 exclusive locks,記為x鎖 排他鎖就是不能與其他鎖並存,只有等待鎖釋放完成以後其他事務才能得到鎖。下面是共享鎖與排他鎖的互斥關係 s ...

mysql排他鎖 mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...

mysql共享鎖與排他鎖

mysql鎖機制分為表級鎖和行級鎖,本文就和大家分享一下我對mysql中行級鎖中的共享鎖與排他鎖進行分享交流。共享鎖又稱為讀鎖,簡稱s鎖,顧名思義,共享鎖就是多個事務對於同一資料可以共享一把鎖,都能訪問到資料,但是只能讀不能修改。排他鎖又稱為寫鎖,簡稱x鎖,顧名思義,排他鎖就是不能與其他所並存,如乙...