MYSQL關於鎖的概述

2021-10-09 05:29:47 字數 1960 閱讀 5569

共享鎖(讀鎖)

共享鎖指的就是對於多個不同的事務,對於乙個資源共享同乙個鎖。對某一資源加共享鎖,自身可可讀該資源,其他人也可以讀該資源(也可以再加共享鎖,即共享鎖共享多個記憶體),但無法修改。要想修改就必須等所有共享鎖都釋放完之後。語法:select * from table lock in share mode;。

比如:視窗1,在乙個未結束的事務中給一條資料加上共享鎖。

begin;

select * from t_red_packet where id = 1 lock in share mode;

視窗2,給同一條資料加上共享鎖,加鎖成功。

select * from t_red_packet where id = 1 lock in share mode;

視窗1和視窗2,更新該行資料,提示[err] 1205 - lock wait timeout exceeded; try restarting transaction。需要等到所有共享鎖釋放,才可以進行update操作。

update t_red_packet

set user_id = 2

排它鎖(寫鎖)

排它鎖指的就是對於多個不同的事務,對同乙個資源只能有一把鎖。對某一資源加排它鎖,自身可以進行增刪改查,其他人無法進行加鎖操作,更無法進行增刪改操作。語法:select * from table for update。

視窗1,在乙個未結束的事務中給一條資料加上排它鎖。

begin;

select * from t_red_packet where id = 1 for update;

視窗1,更新該行資料,成功。

update t_red_packet

set user_id = 2

視窗2,查詢該行資料,可以查詢到。

select * from t_red_packet where id = 1

視窗2給該條資料加鎖,提示[err] 1205 - lock wait timeout exceeded; try restarting transaction。

select * from t_red_packet where id = 1 for update;

共享鎖(又稱為讀鎖,簡稱s鎖):事務對一資料開啟共享鎖,其他事務能訪問到資料,但是只能讀不能修改,只有本事務才能修改資料。

排他鎖(又稱為寫鎖,簡稱x鎖):事務對一資料開啟排他鎖,當前事務沒有提交前,會阻斷其他事務的讀鎖和寫鎖,即不能再在同一資料上加鎖。

行鎖行鎖就是給一行資料進行加鎖。

顯式加鎖:

上共享鎖(讀鎖)的寫法:lock in share mode,例如:

select math from zje where math>60 lock in share mode;

上排它鎖(寫鎖)的寫法:for update,例如:

select math from zje where math >60 for update;

表鎖表鎖就是對一張表進行加鎖。

擴充套件:間隙鎖

當我們用範圍條件而不是相等條件檢索資料,並請求共享或排他鎖時,innodb會給符合條件的已有資料記錄的索引項加鎖;對於鍵值在條件範圍內並不存在的記錄,叫做間隙

innodb也會對這個"間隙"加鎖,這種鎖機制就是所謂的間隙鎖

– 使用者a

update user set count=8 where id>2 and id<6

– 使用者b;

update user set count=10 where id=5;

如果使用者a在進行了上述操作後,事務還未提交,則b無法對2~6之間的記錄進行更新或插入記錄,會阻塞,當a將事務提交後,b的更新操作會執行。

優化建議

盡可能讓所有資料檢索都通過索引來完成,避免無索引行鎖公升級為表鎖

合理設計索引,盡量縮小鎖的範圍

盡可能減少索引條件,避免間隙鎖

盡量控制事務大小,減少鎖定資源量和時間長度

盡可能低級別事務隔離

mysql spring鎖 MySQL鎖概述

鎖是計算機協調多個程序或執行緒併發訪問某一資源的機制。在資料庫中,除傳統的計算資源 如cpu ram i o等 的爭用以外,資料也是一種供許多使用者共享的資源。如何保證資料併發訪問的一致性 有效性是所有資料庫必須解決的乙個問題,鎖衝突也是影響資料庫併發訪問效能的乙個重要因素。從這個角度來說,鎖對資料...

理解mysql鎖(1)鎖的概述

相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...

理解mysql鎖(1)鎖的概述

相對其他資料庫而言,mysql的鎖機制比較簡單 其最顯著的特點是不同的儲存引擎支援不同的鎖機制 但總的來說,mysql各種儲存引擎使用了三種型別的鎖定機制 行級鎖定 頁級鎖定和表級鎖定 其中,myisam主要使用表級鎖定,而使用行級鎖定的主要是innodb。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...