婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁(yè) > 知識(shí)庫(kù) > 你需要理解的關(guān)于MySQL的鎖知識(shí)

你需要理解的關(guān)于MySQL的鎖知識(shí)

熱門標(biāo)簽:電話機(jī)器人的價(jià)格多少錢一個(gè)月 徐涇鎮(zhèn)騰訊地圖標(biāo)注 400電話申請(qǐng)廠家現(xiàn)貨 福建外呼電銷機(jī)器人加盟 自己做地圖標(biāo)注需要些什么 中國(guó)地圖標(biāo)注公司 天津公司外呼系統(tǒng)軟件 百度地圖標(biāo)注要什么軟件 昌德訊外呼系統(tǒng)

一、前言

MySQL 的鎖按照范圍可以分為全局鎖、表鎖、行鎖,其中行鎖是由數(shù)據(jù)庫(kù)引擎實(shí)現(xiàn)的,并不是所有的引擎都提供行鎖,MyISAM 就不支持行鎖,所以文章介紹行鎖會(huì)以InnoDB引擎為例來(lái)介紹行鎖。

二、全局鎖

MySQL 提供全局鎖來(lái)對(duì)整個(gè)數(shù)據(jù)庫(kù)實(shí)例加鎖。

語(yǔ)法:

FLUSH TABLES WITH READ LOCK

這條語(yǔ)句一般都是用來(lái)備份的,當(dāng)執(zhí)行這條語(yǔ)句后,數(shù)據(jù)庫(kù)所有打開(kāi)的表都會(huì)被關(guān)閉,并且使用全局讀鎖鎖定數(shù)據(jù)庫(kù)的所有表,同時(shí),其他線程的更新語(yǔ)句(增刪改),數(shù)據(jù)定義語(yǔ)句(建表,修改表結(jié)構(gòu))和更新類的事務(wù)提交都會(huì)被阻塞。

在mysql 8.0 以后,對(duì)于備份,mysql可以直接使用備份鎖。

語(yǔ)句:

LOCK INSTANCE FOR BACKUPUNLOCK INSTANCE

這個(gè)鎖的作用范圍更廣,這個(gè)鎖會(huì)阻止文件的創(chuàng)建,重命名,刪除,包括 REPAIR TABLE TRUNCATE TABLE, OPTIMIZE TABLE操作以及賬戶的管理都會(huì)被阻塞。當(dāng)然這些操作對(duì)于內(nèi)存臨時(shí)表來(lái)說(shuō)是可以執(zhí)行的,為什么內(nèi)存表不受這些限制呢?因?yàn)閮?nèi)存表不需要備份,所以也就沒(méi)必要滿足這些條件。

三、表鎖

Mysql的表級(jí)別鎖分為兩類,一類是元數(shù)據(jù)鎖(Metadata Lock,MDL),一種是表鎖。

元數(shù)據(jù)鎖(MDL) 不需要顯式使用,在訪問(wèn)一個(gè)表的時(shí)候會(huì)被自動(dòng)加上。這個(gè)特性需要MySQL5.5版本以上才會(huì)支持,當(dāng)對(duì)一個(gè)表做增刪改查的時(shí)候,該表會(huì)被加MDL讀鎖;當(dāng)對(duì)表做結(jié)構(gòu)變更的時(shí)候,加MDL寫鎖。MDL鎖有一些規(guī)則:

讀鎖之間不互斥,所以可以多線程多同一張表進(jìn)行增刪改查。讀寫鎖、寫鎖之間是互斥的,為了保證表結(jié)構(gòu)變更的安全性,所以如果要多線程對(duì)同一個(gè)表加字段等表結(jié)構(gòu)操作,就會(huì)變成串行化,需要進(jìn)行鎖等待。MDL的寫鎖優(yōu)先級(jí)比MDL讀鎖的優(yōu)先級(jí),但是可以設(shè)置max_write_lock_count系統(tǒng)變量來(lái)改變這種情況,當(dāng)寫鎖請(qǐng)求超過(guò)這個(gè)變量設(shè)置的數(shù)后,MDL讀鎖的優(yōu)先級(jí)會(huì)比MDL寫鎖的優(yōu)先級(jí)高。(默認(rèn)情況下,這個(gè)數(shù)字會(huì)很大,所以不用擔(dān)心寫鎖的優(yōu)先級(jí)下降)MDL的鎖釋放必須要等到事務(wù)結(jié)束才會(huì)釋放。

所以我們?cè)诓僮鲾?shù)據(jù)庫(kù)表結(jié)構(gòu)時(shí)候必須要注意不要使用長(zhǎng)事務(wù),這里具體是什么意思呢?我舉個(gè)例子說(shuō)明下:

上圖表示演示了4個(gè)session執(zhí)行語(yǔ)句,首先SessionA開(kāi)啟了事務(wù)沒(méi)有提交,接著sessionB執(zhí)行查詢,因?yàn)槭谦@取MDL讀鎖,所以互相不影響,可以正常執(zhí)行,SessionC新增一個(gè)字段,由于MDL寫和讀是互斥的,所以SessionC會(huì)被阻塞,之后SessionD開(kāi)始執(zhí)行一個(gè)查詢語(yǔ)句,由于SessionC的阻塞,所以SessionD也阻塞了。所以,我們模擬的SessionA的事務(wù)是長(zhǎng)事務(wù),然后后面執(zhí)行了修改表結(jié)構(gòu),會(huì)導(dǎo)致后續(xù)對(duì)該表所有的讀寫操作都不可行了。所以在實(shí)際場(chǎng)景中,如果業(yè)務(wù)請(qǐng)求比較頻繁的時(shí)候,對(duì)表結(jié)構(gòu)進(jìn)行修改的時(shí)候就有可能導(dǎo)致該庫(kù)的線程被阻塞滿。

表鎖 的語(yǔ)法如下:

LOCK TABLES tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ...lock_type: { READ [LOCAL] | [LOW_PRIORITY] WRITE}UNLOCK TABLES

表鎖分為讀鎖和寫鎖,讀鎖不互斥,但是獲取讀鎖不能寫入數(shù)據(jù),其他沒(méi)有獲取到讀鎖的session也是可以讀取表的,所以讀鎖的目的就是限制表被寫。如果表被讀鎖鎖住后,再執(zhí)行插入語(yǔ)句會(huì)報(bào)錯(cuò),報(bào)錯(cuò)如下:

1099 - Table 'XXXX' was locked with a READ lock and can't be updated

寫鎖被獲取后可以對(duì)表進(jìn)行讀寫,寫鎖是互斥的,一旦某個(gè)session獲取到表的寫鎖,另外的session無(wú)法訪問(wèn)這個(gè)表,直到寫鎖被釋放。

表的解鎖可以使用unlock tables解鎖,也可以客戶端口自動(dòng)解鎖。lock tables鎖表會(huì)獨(dú)占式的鎖住表,除了限制其他線程對(duì)該表的讀寫,也會(huì)限制本線程接下來(lái)的操作對(duì)象。

四、行鎖(InnoDB)

MySQL的行鎖是在引擎層面實(shí)現(xiàn)的,所以這里討論的也是InnoDB引擎下的行鎖,下面會(huì)詳細(xì)介紹InnoDB下常見(jiàn)的幾種行鎖

4.1 共享鎖

共享鎖能允許事務(wù)獲取到鎖后進(jìn)行讀操作,共享鎖是不互斥的,一個(gè)事務(wù)獲取到共享鎖后,另外一個(gè)事務(wù)也可以獲取共享鎖,獲取共享鎖后不能進(jìn)行寫操作。

4.2 排它鎖

排他鎖允許事務(wù)獲取到鎖后進(jìn)行更新一行或者刪除某一行操作,排他鎖顧名思義是互斥的,一個(gè)事務(wù)獲取到排他鎖后,其他事務(wù)不能獲取到排他鎖,直到這個(gè)鎖被釋放。

4.3 意向鎖

InnoDB支持多種粒度的鎖,允許行鎖和表鎖共存,這里說(shuō)的意向鎖其實(shí)是一種表級(jí)別的鎖,但是我把它放在行鎖里面是因?yàn)樗粫?huì)單獨(dú)存在,它的出現(xiàn)肯定會(huì)伴隨著行鎖(共享鎖或者排他鎖),它主要的目的就是表示將要鎖定表中的行或者正在鎖定表中的行。

意向鎖根據(jù)和行鎖的組合可以分為:

  • 意向排他鎖:表明將要在表中的某些行獲取排他鎖
  • 意向共享鎖:表明將要在表中的某些行獲取共享鎖

意向鎖的獲取必須在行鎖獲取之前,也就是說(shuō)獲取共享鎖之前必須先要獲取共享意向鎖,對(duì)于排他鎖也是一樣的道理。

那么這個(gè)意向鎖到底有什么作用呢?

解釋這個(gè)之前,我們先看看意向鎖和行鎖之前的兼容關(guān)系:

--- 排他鎖(X) 意向排他鎖(IX) 共享鎖(S) 意向共享鎖(IS)
排他鎖(X) 沖突 沖突 沖突 沖突
意向排他鎖(IX) 沖突 兼容 沖突 兼容
共享鎖(S) 沖突 沖突 兼容 兼容
意向共享鎖(IS) 沖突 兼容 兼容 兼容

我們假設(shè)有2個(gè)事務(wù)A和事務(wù)B,事務(wù)獲取到了共享鎖,鎖住了表中的某一行,這一行只能讀,不能寫,現(xiàn)在事務(wù)B要申請(qǐng)整個(gè)表的寫鎖。如果事務(wù)B申請(qǐng)成功,那么肯定是可以對(duì)表中所有的行進(jìn)行寫操作的,那么肯定與A獲取的行鎖沖突。數(shù)據(jù)庫(kù)為了避免這種沖突,就會(huì)進(jìn)行沖突檢測(cè),那么如何去檢測(cè)呢?有兩種方式:

判斷表是否已經(jīng)被其他事務(wù)用表級(jí)鎖鎖住。判斷表中的每一行是否被行鎖鎖住。

判斷表中的每一行需要遍歷所有記錄,效率太差,所以數(shù)據(jù)庫(kù)就用第一種方式去做沖突檢測(cè),也就是用到了意向鎖。

總結(jié)

本文主要從MySQL的加鎖范圍來(lái)分析了MySQL的鎖,MySQL根據(jù)加鎖范圍可以分為全局鎖、表鎖、行鎖。全局鎖和表鎖是MySQL自己實(shí)現(xiàn),行鎖都是由引擎層面去實(shí)現(xiàn)。InnoDB下的行鎖主要分為共享鎖和排他鎖。共享鎖請(qǐng)求后,行只能讀,共享鎖之間不互斥。排他鎖獲取后能更新和刪除行,排他鎖與其他鎖都互斥。最后我在行鎖的基礎(chǔ)上提到了意向鎖,意向鎖主要表示正在鎖住行或者即將鎖住行,為了在鎖沖突檢測(cè)中提高效率。當(dāng)然InnoDB下還有其他鎖,比如間隙鎖,記錄鎖,Next-Key鎖等,這些都不在本文的探討范圍之內(nèi),如有興趣的同學(xué)可以自行研究。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • 一個(gè)mysql死鎖場(chǎng)景實(shí)例分析
  • MySQL InnoDB中的鎖機(jī)制深入講解
  • 一次神奇的MySQL死鎖排查記錄
  • 實(shí)例講解MySQL中樂(lè)觀鎖和悲觀鎖
  • Mysql查詢正在執(zhí)行的事務(wù)以及等待鎖的操作方式

標(biāo)簽:鄂爾多斯 陜西 北京 荊門 昌都 梅河口 黔西 駐馬店

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《你需要理解的關(guān)于MySQL的鎖知識(shí)》,本文關(guān)鍵詞  你,需要,理解,的,關(guān)于,MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《你需要理解的關(guān)于MySQL的鎖知識(shí)》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于你需要理解的關(guān)于MySQL的鎖知識(shí)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 和平区| 高邮市| 禹城市| 抚远县| 大宁县| 紫云| 文化| 乐山市| 三都| 阿城市| 北票市| 贵溪市| 民丰县| 肥东县| 丁青县| 崇阳县| 乌审旗| 淮北市| 泰宁县| 云浮市| 英吉沙县| 右玉县| 丽水市| 逊克县| 云林县| 邢台县| 宣汉县| 武清区| 黄骅市| 屯昌县| 荃湾区| 伊金霍洛旗| 海城市| 垫江县| 榆树市| 承德县| 手游| 台北县| 金寨县| 桃源县| 庆城县|