MySQL InnoDB行鎖演算法 三種詳解

2021-10-14 11:33:27 字數 1638 閱讀 1625

字面意思,給一行資料加鎖。

innodb 行鎖是通過給索引上的索引項加鎖來實現的,如果沒有索引,innodb 將通過隱藏的聚簇索引來對記錄加鎖。

注意:行鎖必須有索引才能實現,否則會自動鎖全表,那麼就不是行鎖了。 兩個事務不能鎖同乙個索引。

(1)record lock:記錄鎖,單個行記錄上的鎖

鎖住具體的索引項,當sql執行按照唯一性索引進行資料的檢索時,查詢條件等值匹配且查詢的資料是存在,這時sql語句加上的鎖即為記錄鎖record locks,鎖住具體的索引項

begin

;-- 開始事務

select

*from my_table where id =

2021

forupdate

;-- 排它鎖的記錄鎖演算法

rollback

;-- 回滾事務

# 普通事務執行

select

*from my_table where id =

2021

forupdate

;select

*from my_table where id =

2020

forupdate

;

(2)gap lock:間隙鎖,鎖定乙個範圍,但不包含記錄本身

begin;

select

*from my_table where id >

2001

and id <

2021

forupdate

;--排它鎖的間隙鎖演算法

select

*from my_table where id =

2021

forupdate

;-- 另一種方式

rollback

;

(3)next-key lock:record+gap,臨建鎖,鎖定乙個範圍,且包含記錄本身

begin;

select

*from my_table where id >

2001

and id <

2021

forupdate

;--臨建鎖的間隙鎖演算法

-- 其他事務執行

setsession autocommit=

off;

select

*from t2 where id=

4for

update

;--沒鎖住

select

*from t2 where id=

7for

update

;--鎖住

select

*from t2 where id=

10for

update

;--鎖住

insert

into

`t2`

(`id`

,`name`

)values(9

,'9');

rollback

;

MySQL InnoDB 行鎖實現

2019獨角獸企業重金招聘python工程師標準 mysql innodb 行鎖是通過給索引上的索引項加鎖來實現的。oracle 是通過在資料塊中對相應資料行加鎖來實現的。mysql innodb這種行鎖實現特點意味著 只有通過索引條件檢索資料,innodb才使用行級鎖,否則,innodb將使用表鎖...

(mysql)Innodb引擎行鎖學習

mysql常用引擎有myisam和innodb,而innodb是mysql預設的引擎。myisam不支援行鎖,而innodb支援行鎖和表鎖 innodb的行鎖是加在響應的索引上的,即sql語句中有索引,如果沒有就是全表掃瞄,即表鎖 表鎖 不會死鎖,索衝突機率高,併發低 行鎖 會發生死索,索衝突機率低...

mysql InnoDB引擎的行鎖和表鎖

之前是有接觸行鎖和表鎖但是由於沒有實際應用過也只是大概了解,前兩天就遇到了併發同時對一條記錄進行修改。mysql肯定會讓修改請求排隊,也就是說加了鎖,但是mysql預設加的是表鎖,但是會影響效率,所以我們需要用行鎖。表鎖 顧名思義就是對整張表進行加鎖,同一時刻整張表所有記錄都被霸佔,雖然不會出現死鎖...