成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 數據庫鎖:Record Lock, Gap Lock 和 Next-Key Lock

數據庫 MySQL
InnoDB引擎 在 共享鎖和排他鎖 文章中,我們詳細分析了共享鎖和排他鎖在MySQL中是如何工作的,今天,我們接著分析InnoDB引擎的 3種行鎖。

InnoDB引擎 在 共享鎖和排他鎖 文章中,我們詳細分析了共享鎖和排他鎖在MySQL中是如何工作的,今天,我們接著分析InnoDB引擎的三種行鎖。

在MySQL的InnoDB引擎的行鎖主要有三類:

  • Record Lock:記錄鎖,是在索引記錄上加鎖;
  • Gap Lock:間隙鎖,鎖定一個范圍,但不包含記錄;
  • Next-key Lock:Next-key Lock = Gap Lock + Record Lock,它鎖定了一個范圍(Gap Lock實現),并且鎖定記錄本身(Record Lock實現);

一、Record Lock

1. 什么是 Record Lock?

Record Lock,記錄鎖,它是針對索引記錄的鎖,鎖定的總是索引記錄。在多用戶數據庫系統中,多個事務可能會同時嘗試讀取或修改同一條記錄,Record Lock確保只有一個事務能在某一時刻修改該記錄,其他事務只能讀取,或者在寫鎖釋放后再進行修改。

2. 舉例說明

為了更好的說明Record Lock,我們以下面的順序執行流來進行驗證:

加鎖線程  sessionA

線程B  sessionB

線程B  sessionC

#開啟事務
 begin;



給user表id=1加寫鎖
select id from user
 where id = 1 for update;




update user set
 name='name121'
 where id = 1;




查看InnoDB監視器中記錄鎖數據
show engine innodb status\G

commit提交事務
record lock 被釋放




被堵塞的update操作執行ok


示例執行結果如下圖:

通過上面的示例可以看出:

  • 事務A(sessionA)對id=1加排他鎖之后產生了記錄鎖
  • 事務B(sessionB)對id=1的update操作被阻塞了
  • 事務C(sessionC)可以查看到Record Lock

二、Gap Lock

1. 什么是Gap Lock?

Gap Lock,間隙鎖,它是一種行級鎖,鎖住兩個索引記錄之間的間隙,而不是實際的數據記錄,由InnoDB隱式添加。

如下圖:(1,3) 表示鎖住記錄1 和記錄3 之間的間隙,這樣記錄2 就無法插入,間隙可能跨越單個索引值、多個索引值,甚至是空。

在InnoDB中,間隙鎖是通過索引來實現的。這意味著間隙鎖只能作用于索引,而不能直接作用于非索引列。當一個事務對某個索引列上的間隙加鎖時,其他事務就無法在這個間隙中插入新的記錄。

2. 舉例說明

為了更好的說明Gap Lock間隙鎖,我們以下面的順序執行流來進行驗證:

加鎖線程  sessionA

線程B  sessionB

線程C  sessionC

#開啟事務
 begin;



加鎖
select * from user
 where age = 10 for share;




insert into user(id,age) values(2,20);




#查看InnoDB監視器中記錄鎖數據
show engine innodb status\G

commit提交事務
Gap Lock被釋放




# 被堵塞的insert操作執行成功


示例執行結果如下圖:

通過上面的示例執行結果可以看出:

  • 事務A(sessionA)在加共享鎖的時候產生了間隙鎖(Gap Lock)
  • 事務B(sessionB)對間隙中進行insert/update操作,需要先獲取排他鎖(X),導致阻塞
  • 事務C(sessionC)通過show engine innodb status\G指令可以查看到間隙鎖的存在。

需要說明,間隙鎖只是鎖住間隙內部的范圍,在間隙外的insert/update操作不會受影響。

三、Next-Key Lock

1. 什么是Next-Key Lock?

Next-Key Lock,稱為臨鍵鎖,它是Record Lock + Gap Lock的組合,用來鎖定一個范圍,并且鎖定記錄本身鎖,它是一種左開右閉的范圍,可以用符號表示為:(a,b]。如下圖:

2. 舉例說明

為了更好的說明Next-Key Lock,我們以下面的順序執行流來進行驗證:

加鎖線程  sessionA

線程B  sessionB

線程C  sessionC

線程D  sessionD

#開啟事務
 begin;




#加鎖
select * from user
 where age = 10 for share;





#獲取鎖失敗
insert操作被堵塞
insert into 
user(id,age) 
 values(2,20);





#update被堵塞
update user 
 set name='name1'
 where age = 10;

#查看InnoDB監視器中記錄鎖數據
show engine innodb status\G

提交事務Gap Lock被釋放  
 commit





被堵塞的insert操作執行ok

#被堵塞的update操作執行成功


示例執行結果如下圖:

通過上面的示例執行結果可以看出:

  • 事務A(sessionA)在加共享鎖的時候產生了間隙鎖(Gap Lock)
  • 事務B(sessionB)對間隙中進行insert操作,需要先獲取排他鎖(X),導致阻塞。
  • 事務C(sessionC)對間隙中進行update操作,需要先獲取排他鎖(X),導致阻塞。
  • 事務D(sessionD)通過show engine innodb status\G指令可以查看到間隙鎖的存在。需要說明的,間隙鎖只是鎖住間隙內部的范圍,在間隙外的insert/update操作不會受影響。

四、總結

Record Lock,Gap Lock和Gap Lock 3種鎖是存在MySQL的InnoDB引擎的行鎖,MyISAM引擎沒有:

  • Record Lock:記錄鎖,是在索引記錄上加鎖;
  • Gap Lock:間隙鎖,鎖定一個范圍,但不包含記錄,即(A,B);
  • Next-key Lock:Next-key Lock = Gap Lock + Record Lock,它鎖定了一個范圍(Gap Lock實現),并且鎖定記錄本身(Record Lock實現),即(A,B];;

這 3種鎖都是InnoDB引擎隱式添加的,目的是為了解決可重復讀隔離級別下幻讀的現象。

責任編輯:趙寧寧 來源: 猿java
相關推薦

2024-06-12 14:03:31

MySQLInnoDB

2022-04-29 11:39:28

MySQL幻讀Gap Lock

2021-06-08 09:41:26

MySQL加鎖范圍

2021-06-05 18:02:20

MySQL加鎖范圍

2024-04-01 00:01:05

MySQL死鎖DDL

2011-11-28 12:55:37

JavaJVM

2021-01-28 05:17:01

并發包JDK

2021-03-02 12:34:47

MySQL解鎖表鎖定表

2010-09-08 14:49:12

SQL Server數據庫

2011-08-24 16:41:38

LOCK中文man

2024-01-02 14:17:31

MySQLMDL LOCK語句

2025-05-21 10:05:00

C++11多線程編程

2022-06-15 07:32:35

Lock線程Java

2023-07-06 08:06:47

LockCondition公平鎖

2009-08-06 10:35:27

C# lock thi

2021-01-22 08:37:02

二進制Binary SemaReentrant L

2017-02-14 10:00:19

Java開發Lock

2021-01-28 23:26:55

MySQL

2023-05-09 12:46:00

linuxlock

2024-02-26 07:36:09

lockJava語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 香蕉久久网 | 欧美激情久久久 | 在线播放一区二区三区 | 久久精品国产清自在天天线 | 欧美在线 | 免费一二区 | 国产精品久久久久久福利一牛影视 | 免费视频一区 | 国产精品久久久久久 | 一级全黄少妇性色生活免费看 | 久久99久久 | 色综合久久天天综合网 | 午夜a√| 亚洲毛片在线观看 | 欧美人妇做爰xxxⅹ性高电影 | 久久综合亚洲 | 亚洲欧美视频一区 | 欧美精品在欧美一区二区少妇 | 在线国产一区 | 亚洲一区国产 | 天天曰夜夜操 | 红桃视频一区二区三区免费 | 国产日产精品一区二区三区四区 | 日韩福利在线观看 | 成人伊人| 欧美视频一区二区三区 | 四虎影院在线免费观看 | 激情综合五月天 | 亚洲一区av在线 | 国产高清久久久 | 91在线精品一区二区 | 国产区在线视频 | 青草青草久热精品视频在线观看 | 一色一黄视频 | 日韩aⅴ视频| av成年人网站 | 亚洲久久久 | 久久99深爱久久99精品 | 一二三区视频 | 四虎影视在线 | 日韩在线小视频 |