共享鎖(讀鎖)
共享鎖指的就是對於多個不同的事務,對於乙個資源共享同乙個鎖。對某一資源加共享鎖,自身可可讀該資源,其他人也可以讀該資源(也可以再加共享鎖,即共享鎖共享多個記憶體),但無法修改。要想修改就必須等所有共享鎖都釋放完之後。語法: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。表級鎖 開銷小,加鎖快 不會出現死鎖 鎖定...