數(shù)據(jù)庫(kù)系列6-鎖

事務(wù) 鎖 索引 日志文件 數(shù)據(jù)文件 各種buffer flush等概念的串起來

能夠解釋常見場(chǎng)景下 單個(gè)事務(wù)和多事務(wù)并發(fā)場(chǎng)景下,MySQL內(nèi)部處理機(jī)制

在MySQL中,按照鎖定的范圍胧洒,可以分為全局鎖、表級(jí)鎖、行級(jí)鎖嫁乘。

全局鎖

對(duì)MySQL進(jìn)程中的某個(gè)庫(kù)上鎖,上鎖的命令FLUSH TABLES WITH READ LOCK;,這是當(dāng)前數(shù)據(jù)庫(kù)處于只讀狀態(tài)球碉,所有會(huì)改變數(shù)據(jù)蜓斧、表結(jié)構(gòu)等寫操作都會(huì)被阻塞。試驗(yàn)在只讀狀態(tài)下執(zhí)行insert操作睁冬,返回’Can't execute the query because you have a conflicting read lock‘挎春。(為什么是讀鎖沖突?)

全局鎖的使用場(chǎng)景是備份庫(kù),解鎖操作UNLOCK TABLES;

當(dāng)然備份過程中豆拨,肯定是要保證數(shù)據(jù)不會(huì)變更的直奋,不然會(huì)導(dǎo)致,課程中說的加入一個(gè)購(gòu)買流程辽装,包括添加課程和扣款兩個(gè)操作帮碰,如果不加全局鎖,在備份的時(shí)候就可能出現(xiàn)只會(huì)讀到其中一個(gè)操作的數(shù)據(jù)拾积,這就導(dǎo)致了數(shù)據(jù)錯(cuò)亂殉挽?

你可能會(huì)問,這兩個(gè)操作不應(yīng)該是在同一個(gè)事務(wù)中的嗎拓巧,如果只執(zhí)行了一個(gè)動(dòng)作斯碌,說明事務(wù)還未提交,你肯定還看不到更新呀肛度。這個(gè)邏輯我覺得有一定的道理傻唾,但假如這是由兩個(gè)服務(wù)操作的,也就是分布式事務(wù)的場(chǎng)景下承耿,當(dāng)前表的操作肯定先提交了冠骄。所以就能讀到了。

在備份數(shù)據(jù)時(shí)使用全局鎖加袋,不能再寫入了凛辣,那服務(wù)就得停擺,并且作為從庫(kù)時(shí)职烧,也不能及時(shí)同步主庫(kù)過來的binlog了扁誓。所以這種方式的成本很高防泵。基于這個(gè)原因蝗敢,我們可以選用另一種方案捷泞,將dump操作放在一個(gè)可重復(fù)讀的事務(wù)中,利用innodb的mvvc機(jī)制寿谴,就保證了不會(huì)讀到中間狀態(tài)的數(shù)據(jù)了锁右。

表級(jí)鎖

表級(jí)鎖有兩種,一是表鎖拭卿,二是元數(shù)據(jù)鎖(Meta Data Lock)骡湖。

表鎖的語(yǔ)法:lock tables xxx read;或者lock tables xxx write;。解鎖的語(yǔ)法unlock tables;峻厚。

關(guān)于MDL响蕴,從級(jí)別來講也是表級(jí)的,鎖住的當(dāng)前標(biāo)的結(jié)構(gòu)定義惠桃,MDL是系統(tǒng)自動(dòng)添加和釋放的浦夷,DML也分讀和寫兩種。只有讀讀是共享的辜王,當(dāng)加了MDL鎖(讀或者寫)劈狐,DDL會(huì)被阻塞。

行鎖

行鎖是InnoDB特有的呐馆,能實(shí)現(xiàn)更細(xì)粒度的并發(fā)控制肥缔,這也是InnoDB取代MySQL原生存儲(chǔ)引擎MyISAM 的一個(gè)原因。在InnoDB事務(wù)中汹来,行鎖是在需要的時(shí)候才加上的续膳,但并不是不需要了就立刻釋 放,而是要等到事務(wù)結(jié)束時(shí)才釋放收班。這個(gè)就是兩階段鎖協(xié)議 坟岔。

關(guān)于鎖的問題,因?yàn)殒i的釋放是在事務(wù)結(jié)束后才會(huì)釋放的摔桦,如果一個(gè)事務(wù)獲得了鎖A社付,執(zhí)行完畢后,需要再次獲得鎖B邻耕,同時(shí)另一個(gè)事務(wù)鸥咖,已經(jīng)獲得了鎖B,執(zhí)行完后兄世,想要獲得鎖A啼辣。這時(shí)就會(huì)出現(xiàn)死鎖。

當(dāng)然死鎖對(duì)業(yè)務(wù)來說是無(wú)損的碘饼,因?yàn)镸ySQL定義了獲取鎖的超時(shí)時(shí)間熙兔,默認(rèn)是50s。如果超時(shí)艾恼,事務(wù)立即回滾住涉,對(duì)業(yè)務(wù)無(wú)損。但是這個(gè)時(shí)間太長(zhǎng)钠绍,并且也沒有什么依據(jù)來計(jì)算一個(gè)合理的超時(shí)時(shí)間舆声。所以在業(yè)務(wù)開發(fā)過程中,可以考慮將需要被頻繁獲取鎖的操作盡量放在事務(wù)的最后執(zhí)行柳爽,這樣可以盡量減少當(dāng)前事務(wù)對(duì)這個(gè)鎖的持有時(shí)間媳握。

另外一種方案,將熱點(diǎn)行分成多條數(shù)據(jù)磷脯。

問題:當(dāng)事務(wù)執(zhí)行更新操作時(shí)蛾找,MySQL到底選擇是行鎖還是表鎖。其實(shí)結(jié)合MySQL查找數(shù)據(jù)的機(jī)制來看赵誓,當(dāng)定位數(shù)據(jù)走了索引打毛,就會(huì)對(duì)這一行或多行添加行鎖,否則俩功,因?yàn)橹付ㄔ谥麈I索引中從頭遍歷幻枉,所以只能用表鎖。

所謂的行鎖诡蜓,本質(zhì)上在鎖什么 在鎖索引熬甫?

意向鎖 intention lock

“加鎖”操作,本質(zhì)上也會(huì)存在并發(fā)操作蔓罚,怎么保證一個(gè)鎖完整地被某個(gè)事務(wù)獲取呢椿肩,在redis中,setnx

間隙鎖 gap lock

next row lock

樂觀鎖與悲觀鎖

是在使用鎖控制資源競(jìng)爭(zhēng)的前提下脚粟,再次提高并發(fā)能力覆旱。

所謂的悲觀鎖,則認(rèn)為從”我“讀到我再寫的過程中核无,一定會(huì)有其他事務(wù)讀寫扣唱,所以從讀到寫整個(gè)過程我都加鎖。

所謂樂觀鎖团南,則認(rèn)為從”我“讀到我再寫的過程中噪沙,大部分情況下并沒有其他事務(wù)讀寫,所以讀的時(shí)候不再加鎖吐根,等寫的時(shí)候正歼,校驗(yàn)一把數(shù)據(jù)是否還是我當(dāng)時(shí)讀出來的樣子,如果是拷橘,則表示是真沒有其他事務(wù)在讀寫局义,那我就愉快滴把新數(shù)據(jù)寫入喜爷。這樣我的讀寫過程遍享受到了不加鎖的順滑。但假如在我寫的時(shí)候真有其他事務(wù)已經(jīng)謝過了萄唇,那我再重新讀一遍并重新計(jì)算要寫入的數(shù)據(jù)檩帐,一直重復(fù)這個(gè)過程,直至寫入數(shù)據(jù)成功另萤。

按照實(shí)際使用場(chǎng)景湃密,真正存在并發(fā)的時(shí)刻確實(shí)不是100%,所以樂觀鎖的優(yōu)勢(shì)就體現(xiàn)出來了四敞。

延伸:

悲觀鎖泛源、樂觀鎖其實(shí)根據(jù)實(shí)際場(chǎng)景提出的一種鎖優(yōu)化思想,這個(gè)思想在其他地方也有運(yùn)用忿危,比如Java中的自旋+CAS达箍,就是樂觀鎖的一種實(shí)現(xiàn)。比不管三七二十一铺厨,進(jìn)來先通過synchronized獲取鎖要高效多幻梯。本質(zhì)思想,盡可能減少不必要的加鎖操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末努释,一起剝皮案震驚了整個(gè)濱河市碘梢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伐蒂,老刑警劉巖煞躬,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異逸邦,居然都是意外死亡恩沛,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門缕减,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷客,“玉大人,你說我怎么就攤上這事桥狡〗寥梗” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵裹芝,是天一觀的道長(zhǎng)部逮。 經(jīng)常有香客問我,道長(zhǎng)嫂易,這世上最難降的妖魔是什么兄朋? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮怜械,結(jié)果婚禮上颅和,老公的妹妹穿的比我還像新娘傅事。我一直安慰自己,他們只是感情好峡扩,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布享完。 她就那樣靜靜地躺著,像睡著了一般有额。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彼绷,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天巍佑,我揣著相機(jī)與錄音,去河邊找鬼寄悯。 笑死萤衰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的猜旬。 我是一名探鬼主播脆栋,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼洒擦!你這毒婦竟也來了椿争?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤熟嫩,失蹤者是張志新(化名)和其女友劉穎秦踪,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掸茅,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椅邓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昧狮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景馁。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逗鸣,靈堂內(nèi)的尸體忽然破棺而出合住,到底是詐尸還是另有隱情,我是刑警寧澤撒璧,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布聊疲,位于F島的核電站,受9級(jí)特大地震影響沪悲,放射性物質(zhì)發(fā)生泄漏获洲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一殿如、第九天 我趴在偏房一處隱蔽的房頂上張望贡珊。 院中可真熱鬧最爬,春花似錦、人聲如沸门岔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)寒随。三九已至糠悯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間妻往,已是汗流浹背互艾。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讯泣,地道東北人纫普。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像好渠,于是被迫代替她去往敵國(guó)和親昨稼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

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

  • 文章導(dǎo)讀: 累兮拳锚,累兮假栓,要死兮...... 本文解決問題: 1、表級(jí)鎖定(讀鎖霍掺、寫鎖) 2但指、行級(jí)鎖定(共享鎖、排他...
    創(chuàng)造new_world閱讀 637評(píng)論 0 1
  • 一抗楔、簡(jiǎn)介 數(shù)據(jù)庫(kù)鎖定機(jī)制簡(jiǎn)單來說棋凳,就是數(shù)據(jù)庫(kù)為了保證數(shù)據(jù)的一致性,而使各種共享資源在被并發(fā)訪問變得有序所設(shè)計(jì)的一種...
    huangxiongbiao閱讀 429評(píng)論 0 0
  • 1 MySQL的三種鎖 1.1 表鎖 開銷小连躏,加鎖快 不會(huì)出現(xiàn)死鎖 鎖定粒度大剩岳,發(fā)生鎖沖突的概率最高,并發(fā)度最低 ...
    JavaEdge閱讀 643評(píng)論 0 1
  • 本次產(chǎn)品介紹主要包括開箱的過程及產(chǎn)品外觀和結(jié)構(gòu)說明入热。 外觀介紹: 1.對(duì)話按鈕 2.攝像頭 3.表情 4.麥克風(fēng) ...
    jiaminghua閱讀 490評(píng)論 1 0
  • 我是真討厭別人打我的頭拍棕!
    猛虎虎虎閱讀 143評(píng)論 0 0