Mysql InnoDB鎖機(jī)制

一递胧、MySQL鎖機(jī)制概述:

(一)什么是鎖,以及為什么使用鎖和鎖的運(yùn)作撬讽?

鎖是計(jì)算機(jī)協(xié)調(diào)多個(gè)進(jìn)程或純線程并發(fā)訪問某一資源的機(jī)制垮刹。在數(shù)據(jù)庫中野揪,除傳統(tǒng)的計(jì)算資源(CPU奕谭、RAM遗菠、I/O)的爭用以外,數(shù)據(jù)也是一種供許多用戶共享的資源烘豌。如何保證數(shù)據(jù)并發(fā)訪問的一致性载庭、有效性是所在有數(shù)據(jù)庫必須解決的一個(gè)問題,鎖沖突也是影響數(shù)據(jù)庫并發(fā)訪問性能的一個(gè)重要因素。從這個(gè)角度來說囚聚,鎖對數(shù)據(jù)庫而言顯得尤其重要靖榕,也更加復(fù)雜。

防止更新丟失顽铸,并不能單靠數(shù)據(jù)庫事務(wù)控制器來解決茁计,需要應(yīng)用程序?qū)σ碌臄?shù)據(jù)加必要的鎖來解決。

鎖的運(yùn)作谓松?

事務(wù)T在度某個(gè)數(shù)據(jù)對象(如表星压、記錄等)操作之前,先向系統(tǒng)發(fā)出請求鬼譬,對其加鎖娜膘,加鎖后事務(wù)T就對數(shù)據(jù)庫對象有一定的控制,在事務(wù)T釋放它的鎖之前拧簸,其他事務(wù)不能更新此數(shù)據(jù)對象劲绪。

(二)鎖定機(jī)制分類?

按封鎖類型分類:(數(shù)據(jù)對象可以是表可以是記錄)

1)排他鎖:(又稱寫鎖盆赤,X鎖)

一句總結(jié):會阻塞其他事務(wù)讀和寫。

若事務(wù)T對數(shù)據(jù)對象A加上X鎖歉眷,則只允許T讀取和修改A牺六,其他任何事務(wù)都不能再對加任何類型的鎖,知道T釋放A上的鎖汗捡。這就保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A淑际。

2)共享鎖:(又稱讀取,S鎖)

一句總結(jié):會阻塞其他事務(wù)修改表數(shù)據(jù)扇住。

若事務(wù)T對數(shù)據(jù)對象A加上S鎖春缕,則其他事務(wù)只能再對A加S鎖,而不能X鎖艘蹋,直到T釋放A上的鎖锄贼。這就保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對A做任何修改女阀。

(排它鎖)X鎖和(共享鎖)S鎖都是加載某一個(gè)數(shù)據(jù)對象上的宅荤。也就是數(shù)據(jù)的粒度。

按封鎖的數(shù)據(jù)粒度分類如下:

1)行級鎖定(row-level):

一句總結(jié):行級鎖:開銷大浸策,加鎖慢冯键;會出現(xiàn)死鎖;鎖定粒度最小庸汗,發(fā)生鎖沖突的概率最低惫确,并發(fā)度也最高。

詳細(xì):行級鎖定最大的特點(diǎn)就是鎖定對象的顆粒度很小,也是目前各大數(shù)據(jù)庫管理軟件所實(shí)現(xiàn)的鎖定顆粒度最小的改化。由于鎖定顆粒度很小昧诱,所以發(fā)生鎖定資源爭用的概率也最小,能夠給予應(yīng)用程序盡可能大的并發(fā)處理能力而提高一些需要高并發(fā)應(yīng)用系統(tǒng)的整體性能所袁。

缺陷:由于鎖定資源的顆粒度很小盏档,所以每次獲取鎖和釋放鎖需要做的事情也更多,帶來的消耗自然也就更大了燥爷。此外蜈亩,行級鎖定也最容易發(fā)生死鎖。

2)表級鎖定(table-level):

一句總結(jié):表級鎖:開銷小前翎,加鎖快稚配;不會出現(xiàn)死鎖;鎖定粒度大港华,發(fā)生鎖沖突的概率最高道川,并發(fā)度最低。

詳細(xì):和行級鎖定相反立宜,表級別的鎖定是MySQL各存儲引擎中最大顆粒度的鎖定機(jī)制冒萄。該鎖定機(jī)制最大的特點(diǎn)是實(shí)現(xiàn)邏輯非常簡單,帶來的系統(tǒng)負(fù)面影響最小橙数。所以獲取鎖和釋放鎖的速度很快尊流。由于表級鎖一次會將整個(gè)表鎖定,所以可以很好的避免困擾我們的死鎖問題灯帮。

缺陷:鎖定顆粒度大所帶來最大的負(fù)面影響就是出現(xiàn)鎖定資源爭用的概率也會最高崖技,致使并發(fā)度大打折扣。

3)頁級鎖定(page-level):(MySQL特有)

一句總結(jié):頁級鎖:開銷和加鎖時(shí)間界于表鎖和行鎖之間钟哥;會出現(xiàn)死鎖迎献;鎖定粒度界于表鎖和行鎖之間,并發(fā)度一般腻贰。

詳細(xì):頁級鎖定是MySQL中比較獨(dú)特的一種鎖定級別吁恍,在其他數(shù)據(jù)庫管理軟件中也并不是太常見。頁級鎖定的特點(diǎn)是鎖定顆粒度介于行級鎖定與表級鎖之間银受,所以獲取鎖定所需要的資源開銷践盼,以及所能提供的并發(fā)處理能力也同樣是介于上面二者之間。

缺陷:頁級鎖定和行級鎖定一樣宾巍,會發(fā)生死鎖咕幻。

(三)數(shù)據(jù)庫事務(wù)機(jī)制(這個(gè)是數(shù)據(jù)庫核心)

(為什么提及事務(wù)?因?yàn)槭聞?wù)中有封鎖機(jī)制)

1)什么叫事務(wù)顶霞?簡稱ACID肄程。是恢復(fù)和并發(fā)控制的基本單位锣吼。

A 事務(wù)的原子性(Atomicity):指一個(gè)事務(wù)要么全部執(zhí)行,要么不執(zhí)行.也就是說一個(gè)事務(wù)不可能只執(zhí)行了一半就停止了.比如你從取款機(jī)取錢,這個(gè)事務(wù)可以分成兩個(gè)步驟:1劃卡,2出錢.不可能劃了卡,而錢卻沒出來.這兩步必須同時(shí)完成.要么就不完成.

C 事務(wù)的一致性(Consistency):指事務(wù)的運(yùn)行并不改變數(shù)據(jù)庫中數(shù)據(jù)的一致性.例如,完整性約束了a+b=10,一個(gè)事務(wù)改變了a,那么b也應(yīng)該隨之改變.

I 獨(dú)立性(Isolation):事務(wù)的獨(dú)立性也有稱作隔離性,是指兩個(gè)以上的事務(wù)不會出現(xiàn)交錯(cuò)執(zhí)行的狀態(tài).因?yàn)檫@樣可能會導(dǎo)致數(shù)據(jù)不一致.

D 持久性(Durability):事務(wù)的持久性是指事務(wù)執(zhí)行成功以后,該事務(wù)所對數(shù)據(jù)庫所作的更改便是持久的保存在數(shù)據(jù)庫之中,不會無緣無故的回滾.

4)事務(wù)隔離級別:

這個(gè)是mysql用意向鎖來解決事務(wù)并發(fā)問題蓝厌,為了區(qū)別封鎖協(xié)議玄叠,弄了一個(gè)新概念隔離性級別:包括Read Uncommitted、Read Committed拓提、Repeatable Read读恃、Serializable。mysql 一般默認(rèn)Repeatable Read代态。

1.讀未提交(Read Uncommited寺惫,RU)

一句總結(jié):讀取數(shù)據(jù)一致性在最低級別,只能保證不讀物理上損壞的數(shù)據(jù)蹦疑,會臟讀西雀,會不可重復(fù)讀,會幻讀歉摧。

這種隔離級別下艇肴,事務(wù)間完全不隔離,會產(chǎn)生臟讀叁温,可以讀取未提交的記錄再悼,實(shí)際情況下不會使用。

2.讀提交(Read commited券盅,RC)

一句總結(jié):讀取數(shù)據(jù)一致性在語句級別帮哈,不會臟讀,會不可重復(fù)讀锰镀,會幻讀。

僅能讀取到已提交的記錄咖刃,這種隔離級別下泳炉,會存在幻讀現(xiàn)象,所謂幻讀是指在同一個(gè)事務(wù)中嚎杨,多次執(zhí)行同一個(gè)查詢花鹅,返回的記錄不完全相同的現(xiàn)象》阏悖幻讀產(chǎn)生的根本原因是刨肃,在RC隔離級別下,每條語句都會讀取已提交事務(wù)的更新箩帚,若兩次查詢之間有其他事務(wù)提交真友,則會導(dǎo)致兩次查詢結(jié)果不一致。雖然如此紧帕,讀提交隔離級別在生產(chǎn)環(huán)境中使用很廣泛盔然。

3.可重復(fù)讀(Repeatable Read, RR)

一句總結(jié):讀取數(shù)據(jù)一致性在事務(wù)級別桅打,不會臟讀,不會不可重復(fù)讀愈案,會幻讀挺尾。

可重復(fù)讀隔離級別解決了不可重復(fù)讀的問題,但依然沒有解決幻讀的問題站绪。不可重復(fù)讀重點(diǎn)在修改遭铺,即讀取過的數(shù)據(jù),兩次讀的值不一樣恢准;而幻讀則側(cè)重于記錄數(shù)目變化【插入和刪除】魂挂。

4.串行化(Serializable)

一句總結(jié):讀取數(shù)據(jù)一致性在最高級別,事務(wù)級別顷歌,不會臟讀锰蓬,不會不可重復(fù)讀,不會幻讀眯漩。

在串行化隔離模式下芹扭,消除了臟讀,幻象赦抖,但事務(wù)并發(fā)度急劇下降舱卡,事務(wù)的隔離級別與事務(wù)的并發(fā)度成反比,隔離級別越高队萤,事務(wù)的并發(fā)度越低轮锥。實(shí)際生產(chǎn)環(huán)境下,dba會在并發(fā)和滿足業(yè)務(wù)需求之間作權(quán)衡要尔,選擇合適的隔離級別舍杜。

這樣就解釋了為什么僅靠事務(wù)就能解決丟失修改是錯(cuò)誤的了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赵辕,一起剝皮案震驚了整個(gè)濱河市既绩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌还惠,老刑警劉巖饲握,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蚕键,居然都是意外死亡救欧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門锣光,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笆怠,“玉大人,你說我怎么就攤上這事嫉晶∑锝” “怎么了田篇?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箍铭。 經(jīng)常有香客問我泊柬,道長,這世上最難降的妖魔是什么诈火? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任兽赁,我火速辦了婚禮,結(jié)果婚禮上冷守,老公的妹妹穿的比我還像新娘刀崖。我一直安慰自己,他們只是感情好拍摇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布亮钦。 她就那樣靜靜地躺著,像睡著了一般充活。 火紅的嫁衣襯著肌膚如雪蜂莉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天混卵,我揣著相機(jī)與錄音映穗,去河邊找鬼。 笑死幕随,一個(gè)胖子當(dāng)著我的面吹牛蚁滋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赘淮,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辕录,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梢卸?” 一聲冷哼從身側(cè)響起踏拜,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎低剔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肮塞,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡襟齿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枕赵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜欺。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖拷窜,靈堂內(nèi)的尸體忽然破棺而出开皿,到底是詐尸還是另有隱情涧黄,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布赋荆,位于F島的核電站笋妥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏窄潭。R本人自食惡果不足惜春宣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嫉你。 院中可真熱鬧月帝,春花似錦、人聲如沸幽污。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽距误。三九已至簸搞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間深寥,已是汗流浹背攘乒。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惋鹅,地道東北人则酝。 一個(gè)月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像闰集,于是被迫代替她去往敵國和親沽讹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容