字面意思,給一行資料加鎖。
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預設加的是表鎖,但是會影響效率,所以我們需要用行鎖。表鎖 顧名思義就是對整張表進行加鎖,同一時刻整張表所有記錄都被霸佔,雖然不會出現死鎖...