精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

簡單了解 MySQL 中相關的鎖

數據庫 MySQL
在 InnoDB 中,都有哪些鎖?其實你應該已經知道了很多了,例如面試中會問你存儲引擎 MyISAM 和 InnoDB 的區別,你會說 MyIASM 只有表鎖,但是 InnoDB 同時支持行鎖和表鎖。你可能還會被問到樂觀鎖和悲觀鎖的區別是啥。

本文主要是帶大家快速了解 InnoDB 中鎖相關的知識

為什么需要加鎖

首先,為什么要加鎖?我想我不用多說了,想象接下來的場景你就能 GET 了。

你在商場的衛生間上廁所,此時你一定會做的操作是啥?鎖門。如果不鎖門,上廁所上著上著,啪一下門就被打開了,可能大概也許似乎貌似有那么一丁點的不太合適。

數據也是一樣,在并發的場景下,如果不對數據加鎖,會直接破壞數據的一致性,并且如果你的業務涉及到錢,那后果就更嚴重了。

鎖門表情包

鎖的分類

在 InnoDB 中,都有哪些鎖?其實你應該已經知道了很多了,例如面試中會問你存儲引擎 MyISAM 和 InnoDB 的區別,你會說 MyIASM 只有表鎖,但是 InnoDB 同時支持行鎖和表鎖。你可能還會被問到樂觀鎖和悲觀鎖的區別是啥。

鎖的概念、名詞很多,如果你沒有對鎖構建出一個完整的世界觀,那么你理解起來就會比較有阻礙,接下來我們把這些鎖給分一下類。

按照鎖的粒度

按照鎖的粒度進行劃分可以分為:

  • 表鎖
  • 行鎖

這里就不討論頁鎖了,頁鎖是 BDB(BerkeleyDB) 存儲引擎中才有的概念,我們這里主要討論 InnoDB 存儲引擎。

按照鎖的思想

按照加鎖的思想可以分為:

  • 悲觀鎖
  • 樂觀鎖

這里的悲觀、樂觀和你平時理解的名詞是同一個意思。樂觀鎖認為大概率不會發生沖突,只在必要的時候加鎖。而悲觀鎖認為大概率會沖突,所以無論是否必要加鎖都會執行加鎖操作。

按照兼容性

按照兼容性可以把鎖劃分為:

  • 共享鎖
  • 排他鎖

被加上共享鎖的資源,能夠和其他人進行共享,而如果被加上了排他鎖,其他人在拿不到這把鎖的情況下是無法進行任何操作的。

按照鎖的實現

這里的實現就是 InnoDB 中具體的鎖的種類了,分別有:

  • 意向鎖(Intention Locks)
  • 記錄鎖(Record Locks)
  • 間隙鎖(Gap Locks)
  • 臨鍵鎖(Next-Key Locks)
  • 插入意向鎖(Insert Intention Locks)
  • 自增鎖(AUTO-INC Locks)

即使按照這種分類來對鎖進行了劃分,看到了這么多的鎖的名詞可能仍然會有點懵。比如我SELECT ... FOR UPDATE 的時候到底加的是什么鎖?

我們應該透過現象看本質,本質是什么?本質是鎖到底加在了什么對象上,而這個很好回答:

  • 加在了表上
  • 加在了行上

而對于加在行上的鎖,其本質又是什么?本質是將鎖加在了索引上。

意向鎖

在 InnoDB 中支持了不同粒度的鎖,行鎖和表鎖。例如lock tables命令就會持有對應表的排他鎖。為了使多種不同粒度的鎖更實用,InnoDB 設計了意向鎖。

意向鎖是一種表級鎖,它表明了接下來的事務中,會使用哪種類型的鎖,它有以下兩種類型:

  • 共享意向鎖(IS) 表明該事務會打算對表中的記錄加共享鎖
  • 獨占意向鎖(IX) 則是加排他鎖

例如,select ... for share就是加的共享意向鎖,而SELECT .. FOR UPDATE則是加的獨占意向鎖。其規則如下:

  • 一個事務如果想要獲取某張表中某行的共享鎖,它必須先獲取該表的共享意向鎖,或者獨占意向鎖。
  • 同理,如果想獲取排他鎖,它必須先獲取獨占意向鎖

下圖是這幾種鎖的組合下相互互斥、兼容的情況

對照上面的表,在相互兼容的情況下,對應的事務就能獲取鎖,但是如果不兼容則無法獲取鎖,直到不兼容的鎖釋放之后才能獲取。

看到這里你可能就會有問題了,那既然意向鎖除了 LOCK TBALES 之外什么都不阻塞。那我要它何用?

還是通過例子,假設事務 A 獲取了 student 表中 id = 100 這行的共享鎖,之后事務 B 需要申請 student 表的排他鎖。而這兩把鎖明顯是沖突的,而且還是對于同一行。

那 InnoDB 需要如何感知 A 獲取了這把鎖?遍歷整個 B+ 樹嗎?不,答案就是意向鎖。事務 B 申請寫表的排他鎖時,InnoDB 會發現事務 A 已經獲取了該表的意向共享鎖,說明 student 表中已經有記錄被共享鎖鎖住了。此時就會阻塞住。

并且,意向鎖除了像LOCK TABLES這種操作之外,不會阻塞其他任何操作。換句話說,意向鎖只會和表級別的鎖之間發生沖突,而不會和行級鎖發生沖突。因為意向鎖的主要目的是為了表明有人即將、或者正在鎖定某一行。

就像你去圖書館找書,你并不需要每個書架挨著挨著找,直接去服務臺用電腦一搜,就知道圖書館有沒有這本書。

記錄鎖

這就是記錄鎖,是行鎖的一種。記錄鎖的鎖定對象是對應那行數據所對應的索引。對索引不太清楚的可以看看這篇文章。

當我們執行SELECT * FROM student WHERE id = 1 FOR UPDATE語句時,就會對值為1的索引加上記錄鎖。至于要是一張表里沒有索引該怎么辦?這個問題在上面提到的文章中也解釋過了,當一張表沒有定義主鍵時,InnoDB 會創建一個隱藏的RowID,并以此 RowID 來創建聚簇索引。后續的記錄鎖也會加到這個隱藏的聚簇索引上。

當我們開啟一個事務去更新 id = 1 這行數據時,如果我們不馬上提交事務,然后再啟一個事務去更新 id = 1 的行,此時使用 show engine innodb status查看,我們可以看到lock_mode X locks rec but not gap waiting的字樣。

X是排他鎖的意思,從這可以看出來,記錄鎖其實也可以分為共享鎖、排他鎖模式。當我們使用FOR UPDATE是排他,而使用LOCK IN SHARE MODE 則是共享。

而在上面字樣中出現的 gap 就是另一種行鎖的實現間隙鎖。

間隙鎖

對于間隙鎖(Gap Locks)而言,其鎖定的對象也是索引。為了更好的了解間隙鎖,我們舉個例子。

  1. SELECT name FROM student WHERE age BETWEEN 18 AND 25 FOR UPDATE 

假設我們為 age 建立了非聚簇索引,運行該語句會阻止其他事務向 student 表中新增 18-25 的數據,無論表中是否真的有 age 為 18-25 的數據。因為間隙鎖的本質是鎖住了索引上的一個范圍,而 InnoDB 中索引在底層的B+樹上的存儲是有序的。

再舉個例子:

  1. SELECT * FROM student WHERE age = 10 FOR UPDATE

值得注意的是,這里的 age 不是唯一索引,就是一個簡單的非聚簇索引。此時會給 age = 10的數據加上記錄鎖,并且鎖定 age < 10 的 Gap。如果當前這個事務不提交,其他事務如果要插入一條 age < 10 的數據時,會被阻塞住。

間隙鎖是 MySQL 在對性能、并發綜合考慮之下的一種折中的解決方案,并且只在**可重復讀(RR)下可用,如果當前事務的隔離級別為讀已提交(RC)**時,MySQL會將間隙鎖禁用。

剛剛說了,記錄鎖分為共享、排他,間隙鎖其實也一樣。但是不同于記錄鎖的一點,共享間隙鎖、排他間隙鎖相互不互斥,這是怎么回事?

我們還是需要透過現象看到本質,間隙鎖的目的是什么?

為了防止其他事務在 Gap 中插入數據

那共享、排他間隙鎖在這個目標上是一致的,所以是可以同時存在的。

臨鍵鎖

臨鍵鎖(Next-Key Locks)是 InnoDB 最后一種行鎖的實現,臨鍵鎖實際上是記錄鎖和間隙鎖的組合。換句話說,臨鍵鎖會給對應的索引加上記錄鎖,并且外加鎖定一個區間。

但是并不是所有臨鍵鎖都是這么玩的,對于下面的SQL:

  1. SELECT * FROM student WHERE id = 23; 

在這種情況下,id是主鍵,唯一索引,無論其他事務插入了多少數據,id = 23這條數據永遠也只有一條。此時再加一個間隙鎖就完全沒有必要了,反而會降低并發。所以,在使用的索引是唯一索引的時候,臨鍵鎖會降級為記錄鎖。

假設我們有10,20,30總共3條索引數據。那么對應臨鍵鎖來說,可能鎖定的區間就會如下:

  • (∞, 10]
  • (10, 20]
  • (20, 30]
  • (30, ∞)

InnoDB 的默認事務隔離級別為可重復讀(RR),在這個情況下,InnoDB 就會使用臨鍵鎖,以防止幻讀的出現。

簡單解釋一下幻讀,就是在事務內,你執行了兩次查詢,第一次查詢出來 5 條數據,但是第二次再查,居然查出了 7 條數據,這就是幻讀。

可能你在之前的很多博客,或者面試八股文上,了解到過 InnoDB 的RR事務隔離級別可以防止幻讀,RR防止幻讀的關鍵就是臨鍵鎖。

舉個例子,假設 student 表中就兩行數據,id分別為90和110.

  1. SELECT * FROM student WHERE id > 100 FOR UPDATE

當執行該 SQL 語句之后,InnoDB就會給區間 (90, 110] 和(110,∞) 加上間隙鎖,同時給 id=110 的索引加上記錄鎖。這樣以來,其他事務就無法向這個區間內新增數據,即使 100 根本不存在。

插入意向鎖

接下來是插入意向鎖(Insert Intention Locks),當我們執行 INSERT 語句之前會加的鎖。本質上是間隙鎖的一種。

還是舉個例子,假設我們現在有索引記錄10、20,事務A、B分別插入索引值為14、16的數據,此時事務A和B都會用插入意向鎖鎖住 10-20 之間的 Gap,獲取了插入意向鎖之后就會獲取14、16的排他鎖。

此時事務A和B是不會相互阻塞的,因為他們插入的是不同的行。

自增鎖

最后是自增鎖(AUTO-INC Locks),自增鎖的本質是表鎖,較為特殊。當事務 A 向包含了 AUTO_INCREMENT 列的表中新增數據時,就會持有自增鎖。而此時其他的事務 B 則必須要等待,以保證事務 A 取得連續的自增值,中間不會有斷層。

 

責任編輯:姜華 來源: SH的全棧筆記
相關推薦

2021-11-26 08:07:16

MySQL SQL 語句數據庫

2020-02-06 10:02:45

MySQL數據庫全局鎖

2021-06-07 07:59:37

MySQL 全局鎖線程

2011-03-30 13:44:45

MySQL數據庫鎖機制

2022-04-25 10:04:58

MySQL性能數據

2024-01-29 07:43:42

Java獨占鎖共享鎖

2024-07-25 09:01:22

2010-05-24 15:18:38

Linux SNMP

2023-08-17 14:10:11

Java開發前端

2021-11-26 09:53:55

MYSQL開發數據庫

2010-07-27 09:00:32

MySQL鎖

2025-02-10 09:58:48

2009-12-17 18:16:44

JRuby語言技術

2022-04-21 10:39:29

InnoDB意向鎖SQL

2024-10-14 16:25:59

C#線程鎖代碼

2010-11-02 16:39:32

DB2鎖的類型

2010-10-08 13:45:20

MYSQL中TIMES

2024-03-04 00:01:00

鎖表鎖行MySQL

2021-07-07 10:45:20

MySQL表級鎖MyISAM

2017-05-16 08:59:16

MVCCMYSQL樂觀鎖
點贊
收藏

51CTO技術棧公眾號

国产精品www.| 爱情电影社保片一区| 韩国精品一区二区| 精品少妇v888av| 无码人妻精品一区二区三区温州| 欧美黑人粗大| 亚洲欧美激情在线| 欧美精品一区二区三区四区五区| 中文字幕二区三区| 在线精品一区| 日韩亚洲欧美中文高清在线| 黄色性视频网站| 99热播精品免费| 亚洲综合999| 色播五月综合| 亚洲AV无码乱码国产精品牛牛| 免费在线欧美黄色| 欧美成人激情视频| 黄色片在线观看免费| 91大神精品| 欧美日韩精品久久久| 黄色一级视频在线播放| 黄网址在线观看| 久久精品一区八戒影视| 成人看片在线| 97成人在线观看| 久久久久久自在自线| 欧美韩国理论所午夜片917电影| 一区二区精品免费| 精品国产影院| 日韩欧美的一区| 中文字幕在线综合| 欧美成人精品三级网站| 精品久久久国产| 欧美日韩激情四射| 国产超级va在线视频| 国产嫩草影院久久久久| 欧美日韩一区二区三区免费| 黄色福利在线观看| 国产伦精一区二区三区| 国产精品私拍pans大尺度在线 | 欧美黑人巨大精品一区二区| 91香蕉国产视频| 国产区精品区| 亚洲天堂男人天堂| 精品人妻互换一区二区三区| 全球av集中精品导航福利| 精品国产一区二区三区久久影院| 手机av在线网站| 91精品网站在线观看| 欧美色窝79yyyycom| 无码人妻精品一区二区三区66| 中文在线免费二区三区| 欧美日韩一区二区三区在线免费观看 | 国模吧一区二区| 成熟的女同志hd| 亚洲大全视频| 欧美高清视频一区二区| 久久久久久福利| 激情久久久久久久| 88xx成人精品| 中文字幕在线播| 日本少妇一区二区| 国产精品美女呻吟| 97精品人妻一区二区三区香蕉| 久久国产人妖系列| 成人中文字幕在线观看 | 亚洲精品一区在线观看| 欧美激情 亚洲| 私拍精品福利视频在线一区| 亚洲人成网在线播放| 91精品国自产在线| 91成人免费| 韩国福利视频一区| 亚洲GV成人无码久久精品| 国产精品一二| 国产精品电影观看| 国产一区二区三区视频免费观看| 国产一区二区导航在线播放| 99久久99久久| 青青草免费在线视频| 亚洲国产精品ⅴa在线观看| 正在播放精油久久| ririsao久久精品一区| 色综合中文综合网| 天天干天天色天天干| 国产精品22p| 国产亚洲激情视频在线| 四虎永久免费地址| 亚洲激情一区| 国产成人精品久久久| 国产精品久久影视| 99精品视频中文字幕| 日韩久久久久久久| 欧美野外wwwxxx| 色综合天天综合| 三级黄色片播放| 日韩精选在线| 欧美成人免费在线观看| 91美女免费看| 精品无人区卡一卡二卡三乱码免费卡 | 50度灰在线观看| 中文字幕21页在线看| 91精品在线免费| 久久精品老司机| 欧美激情偷拍| 国产精品狠色婷| 人成网站在线观看| 国产精品电影一区二区三区| 免费 成 人 黄 色| 韩国三级大全久久网站| 亚洲性日韩精品一区二区| 免费人成年激情视频在线观看| 日本亚洲免费观看| 好看的日韩精品| a级网站在线播放| 在线中文字幕一区二区| 亚洲精品乱码久久久久久蜜桃欧美| 精品国产一区二区三区小蝌蚪| 久久久久久久久网站| 亚洲一卡二卡在线观看| 久久影院午夜论| 成人免费观看在线| 激情久久免费视频| 在线午夜精品自拍| 波多野结衣视频在线看| 91麻豆蜜桃一区二区三区| 欧美 日韩 国产精品| 久久麻豆视频| 中文字幕成人精品久久不卡 | 亚洲一区免费| 国产精品久久久久久久免费大片| 黄网站在线播放| 精品1区2区3区| 一区二区伦理片| 亚洲欧美日韩国产综合精品二区| av噜噜色噜噜久久| 主播国产精品| 日韩欧美aaaaaa| 成人涩涩小片视频日本| 精品在线你懂的| 伊人情人网综合| 狠狠久久综合| 日韩在线观看免费| 亚洲综合网av| 亚洲桃色在线一区| 99精品999| 亚洲成av人片一区二区密柚| 成人春色激情网| 国产黄色小视频在线| 91麻豆精品国产| 欧美一级特黄高清视频| 国模无码大尺度一区二区三区| 亚洲图片小说在线| 高清亚洲高清| 日韩色av导航| 精品国精品国产自在久不卡| 一区二区三区四区五区视频在线观看| 特级黄色片视频| 欧美日韩国产综合网| 国产精品免费一区二区三区| 波多野结衣中文字幕久久| 精品国产免费人成电影在线观看四季| 精品一区二区三区四| 99国产精品久久久久久久久久久| 日本日本19xxxⅹhd乱影响| 天海翼亚洲一区二区三区| 日本中文字幕久久看| 国产大学生校花援交在线播放| 91成人在线免费观看| www.涩涩爱| 国产黄色成人av| www插插插无码视频网站| 亚洲欧美成人vr| 91精品久久久久久久久久入口| 97caopron在线视频| 亚洲第一综合天堂另类专| 日本特级黄色片| 国产精品美女一区二区在线观看| 在线视频一二区| 亚洲国产一区二区三区a毛片| 久久青青草综合| 国产精品传媒麻豆hd| 色与欲影视天天看综合网| 亚洲 欧美 精品| 精品视频一区三区九区| 国产精品99精品无码视| 国产婷婷精品av在线| 手机av在线网站| 久久精品道一区二区三区| 亚洲精品一品区二品区三品区| 国产精品亚洲四区在线观看| 91精品国产高清久久久久久91| 成人午夜影视| 精品电影一区二区三区| 国产天堂第一区| 亚洲国产日韩在线一区模特 | 色窝窝无码一区二区三区| 色狠狠一区二区三区香蕉| 在线观看亚洲网站| 91小视频在线免费看| 色呦色呦色精品| 午夜在线视频一区二区区别| 麻豆映画在线观看| 美日韩中文字幕| 成人久久18免费网站漫画| 亚洲电影有码| 午夜精品一区二区三区在线播放| 嫩草香蕉在线91一二三区| 日韩成人中文字幕| 99久久亚洲精品日本无码| 欧美三级免费观看| 青春草免费视频| 国产精品乱人伦| 国产熟妇搡bbbb搡bbbb| 成人一级片网址| 在线免费观看av网| 日韩高清在线不卡| 浮妇高潮喷白浆视频| 在线观看日韩| 中文字幕免费在线不卡| 精品国产欧美日韩| 精品久久久久久一区二区里番| 91精品一久久香蕉国产线看观看| 国产91免费看片| 小早川怜子影音先锋在线观看| 色综合久综合久久综合久鬼88| 色开心亚洲综合| 亚洲小视频在线观看| 视频一区二区三区在线看免费看| 日韩精品一区在线观看| 91女人18毛片水多国产| 91成人在线精品| 色老头在线视频| 色视频成人在线观看免| 国产精品视频免费播放| 亚洲成a人在线观看| 久久免费视频99| 亚洲综合成人在线视频| 麻豆成人在线视频| 亚洲一区二区四区蜜桃| 精品无码m3u8在线观看| 亚洲一区二区精品视频| 国产一级生活片| 亚洲国产视频a| 日韩 国产 在线| 黑人精品xxx一区一二区| 国产成人无码精品| 黄色一区二区在线| 依依成人综合网| 色婷婷久久久亚洲一区二区三区| 日本熟女毛茸茸| 色婷婷国产精品| 日韩精选在线观看| 欧美日韩免费不卡视频一区二区三区| 羞羞色院91蜜桃| 欧美日韩中文字幕一区| 一级黄色片在线播放| 欧美精品久久一区| 亚洲精品911| 日韩不卡在线观看| 欧美日韩在线精品一区二区三区激情综 | 在线黄色免费观看| 久久99这里只有精品| 夜夜爽久久精品91| 不卡视频免费播放| 丰满少妇高潮一区二区| 国产蜜臀97一区二区三区| 亚洲激情图片网| 亚洲一区二区精品久久av| 国产又大又黄视频| 欧美日韩久久一区二区| 国产高清免费在线观看| 亚洲国产精久久久久久 | 国产一区二区三区精彩视频 | 91精品国产乱码久久久久久 | 国产精品蜜臀| 51色欧美片视频在线观看| 欧美成a人片在线观看久| 成人激情视频在线| 加勒比中文字幕精品| 特级西西444www大精品视频| 欧美aa国产视频| 久草青青在线观看| 精品无码三级在线观看视频 | 亚洲69av| 国产高清免费在线| 午夜一区不卡| 手机在线免费毛片| 久久久精品欧美丰满| 欧美被狂躁喷白浆精品| 一本色道久久综合亚洲aⅴ蜜桃| 国产一区二区三区四区视频| 亚洲国产日韩欧美在线99| aaa在线免费观看| 国产+人+亚洲| 精品国产鲁一鲁****| 久久久久久久久久久一区| 综合激情一区| 色综合手机在线| www.色综合.com| 中文字幕亚洲欧美日韩| 在线视频国内自拍亚洲视频| 亚洲第一色网站| 日韩在线视频一区| a一区二区三区| 国产精品免费在线| 91综合久久| 国产精品无码一本二本三本色| 国产福利91精品一区| 国产18无套直看片| 香蕉久久一区二区不卡无毒影院| 91麻豆一区二区| 国产性色av一区二区| 两个人看的在线视频www| 亚洲一区二区中文| 欧美艳星介绍134位艳星| 妞干网在线观看视频| 国产精品亚洲а∨天堂免在线| 美国黑人一级大黄| 欧美性xxxxx极品娇小| 高h放荡受浪受bl| 欧美成人精品xxx| 成人亚洲精品| 亚洲精品乱码视频| 青青青爽久久午夜综合久久午夜| 久久人人爽人人人人片| 亚洲一区二区三区在线播放| 国产乱人乱偷精品视频a人人澡| 一区二区欧美日韩视频| 免费亚洲电影| 久久久99爱| 亚洲日本欧美| 欧美xxxxx精品| 亚洲国产精品久久艾草纯爱| 国产激情久久久久久熟女老人av| 日韩中文在线不卡| 日韩黄色在线| 一区二区三区日韩视频| 久久精品99久久久| 日本精品久久久久中文| 欧美羞羞免费网站| 大乳在线免费观看| 国产精品精品视频| 人人狠狠综合久久亚洲婷| 欧美午夜性生活| 国产精品美女一区二区| 夜夜躁狠狠躁日日躁av| 久久精品国产96久久久香蕉| 99视频这里有精品| 中国女人做爰视频| 国产99久久久国产精品潘金 | 色激情天天射综合网| 国产69久久| 91久久嫩草影院一区二区| 综合激情婷婷| xfplay5566色资源网站| 欧美日韩免费观看中文| 日本韩国精品一区二区| 国产98色在线| 日韩1区2区| 午夜免费福利网站| 亚洲图片欧美综合| 亚洲欧美色视频| 国产精品电影网| 一二三区不卡| 手机在线看片日韩| 在线观看不卡一区| av在线播放观看| 国产区二精品视| 日韩电影一区二区三区| 糖心vlog免费在线观看| 精品福利视频一区二区三区| 成人黄色免费短视频| 国产精品jizz在线观看老狼| 成人一区在线看| 国产99久久久久久免费看| 另类少妇人与禽zozz0性伦| 风间由美一区二区av101| 国产一区视频免费观看| 中文字幕一区二区视频| 好吊视频一区二区三区| 国产精品 欧美在线| 在线一区免费| 久久久久久久久久久国产精品| 欧美日韩一二区| 成人爽a毛片免费啪啪动漫| 日本午夜精品电影| 国产成人综合视频| 国产suv精品一区二区33| 欧美另类xxx| 欧美日韩一区二区综合 | 日本一二三四高清不卡| www.蜜臀av| 国产成人在线一区二区| 国产精品www.| 成人无码精品1区2区3区免费看| 亚洲精品福利视频| 国产精品免费精品自在线观看 | 韩国主播福利视频一区二区三区|