更新時(shí)間:2021-01-26 17:49:34 來源:動(dòng)力節(jié)點(diǎn) 瀏覽1281次
鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或線程并發(fā)訪問某一資源的機(jī)制。鎖保證數(shù)據(jù)并發(fā)訪問的一致性、有效性;鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個(gè)重要因素。鎖是Mysql在服務(wù)器層和存儲(chǔ)引擎層的的并發(fā)控制。MySQL中從對(duì)數(shù)據(jù)操作的粒度分為表鎖和行鎖。表鎖是指對(duì)一整張表加鎖,一般是 DDL 處理時(shí)使用;而行鎖則是鎖定某一行或者某幾行,或者行與行之間的間隙。本文我們就重點(diǎn)來介紹MySQL行鎖。
行鎖不同存儲(chǔ)引擎的行鎖實(shí)現(xiàn)不同,后續(xù)沒有特別說明,則行鎖特指 InnoDB 實(shí)現(xiàn)的行鎖。在了解 InnoDB 的加鎖原理前,需要對(duì)其存儲(chǔ)結(jié)構(gòu)有一定的了解。InnoDB 是聚簇索引,也就是 B+樹的葉節(jié)點(diǎn)既存儲(chǔ)了主鍵索引也存儲(chǔ)了數(shù)據(jù)行。而 InnoDB 的二級(jí)索引的葉節(jié)點(diǎn)存儲(chǔ)的則是主鍵值,所以通過二級(jí)索引查詢數(shù)據(jù)時(shí),還需要拿對(duì)應(yīng)的主鍵去聚簇索引中再次進(jìn)行查詢。
行鎖的模式有:讀意向鎖,寫意向鎖,讀鎖,寫鎖和自增鎖(auto_inc),下面我們依次來看。
1.讀寫鎖
讀鎖,又稱共享鎖(Share locks,簡(jiǎn)稱 S 鎖),加了讀鎖的記錄,所有的事務(wù)都可以讀取,但是不能修改,并且可同時(shí)有多個(gè)事務(wù)對(duì)記錄加讀鎖。
寫鎖,又稱排他鎖(Exclusive locks,簡(jiǎn)稱 X 鎖),或獨(dú)占鎖,對(duì)記錄加了排他鎖之后,只有擁有該鎖的事務(wù)可以讀取和修改,其他事務(wù)都不可以讀取和修改,并且同一時(shí)間只能有一個(gè)事務(wù)加寫鎖。
2.讀寫意向鎖
由于表鎖和行鎖雖然鎖定范圍不同,但是會(huì)相互沖突。所以當(dāng)你要加表鎖時(shí),勢(shì)必要先遍歷該表的所有記錄,判斷是否加有排他鎖。這種遍歷檢查的方式顯然是一種低效的方式,MySQL 引入了意向鎖,來檢測(cè)表鎖和行鎖的沖突。意向鎖也是表級(jí)鎖,也可分為讀意向鎖(IS 鎖)和寫意向鎖(IX 鎖)。當(dāng)事務(wù)要在記錄上加上讀鎖或?qū)戞i時(shí),要首先在表上加上意向鎖。這樣判斷表中是否有記錄加鎖就很簡(jiǎn)單了,只要看下表上是否有意向鎖就行了。意向鎖之間是不會(huì)產(chǎn)生沖突的,也不和 AUTO_INC 表鎖沖突,它只會(huì)阻塞表級(jí)讀鎖或表級(jí)寫鎖,另外,意向鎖也不會(huì)和行鎖沖突,行鎖只會(huì)和行鎖沖突。
3.自增鎖
AUTOINC 鎖又叫自增鎖(一般簡(jiǎn)寫成 AI 鎖),是一種表鎖,當(dāng)表中有自增列(AUTOINCREMENT)時(shí)出現(xiàn)。當(dāng)插入表中有自增列時(shí),數(shù)據(jù)庫需要自動(dòng)生成自增值,它會(huì)先為該表加 AUTOINC 表鎖,阻塞其他事務(wù)的插入操作,這樣保證生成的自增值肯定是唯一的。AUTOINC 鎖具有如下特點(diǎn):
1)AUTO_INC 鎖互不兼容,也就是說同一張表同時(shí)只允許有一個(gè)自增鎖;
2)自增值一旦分配了就會(huì) +1,如果事務(wù)回滾,自增值也不會(huì)減回去,所以自增值可能會(huì)出現(xiàn)中斷的情況。
顯然,AUTOINC 表鎖會(huì)導(dǎo)致并發(fā)插入的效率降低,為了提高插入的并發(fā)性,MySQL 從 5.1.22 版本開始,引入了一種可選的輕量級(jí)鎖(mutex)機(jī)制來代替 AUTOINC 鎖,可以通過參數(shù) innodbautoinclockmode 來靈活控制分配自增值時(shí)的并發(fā)策略。
行鎖是MySQL數(shù)據(jù)庫中非常重要的鎖,行鎖根據(jù)場(chǎng)景的不同又可以進(jìn)一步細(xì)分,依次為 Next-Key Lock,Gap Lock 間隙鎖,Record Lock 記錄鎖和插入意向 GAP 鎖。不同的鎖鎖定的位置是不同的,比如說記錄鎖只鎖住對(duì)應(yīng)的記錄,而間隙鎖鎖住記錄和記錄之間的間隔,Next-Key Lock 則所屬記錄和記錄之前的間隙。想要了解這些行鎖的詳細(xì)信息,可以查看本站的MySQL教程,帶你全面解析MySQL行鎖。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問老師會(huì)電話與您溝通安排學(xué)習(xí)