MySQL中的鎖

事務(wù)及其ACID屬性:

事務(wù)是由一組sql語(yǔ)句組成的邏輯處理單元春霍,具有4個(gè)屬性

原子性:事務(wù)是一個(gè)原子操作單元翅睛,其對(duì)數(shù)據(jù)的修改捅僵,要么都執(zhí)行,要么都不執(zhí)行

一致性:事務(wù)開(kāi)始和完成的時(shí)候掖看,數(shù)據(jù)都必須保持一致匣距。事物的修改必須保持?jǐn)?shù)據(jù)的完整性,事務(wù)結(jié)束后所有的內(nèi)部數(shù)據(jù)結(jié)構(gòu)(B+樹(shù)哎壳,雙向鏈表)多必須是正確的

隔離性:數(shù)據(jù)庫(kù)系統(tǒng)提供一定的隔離機(jī)制毅待,保證事務(wù)在不受外界并發(fā)操作影響的環(huán)境中執(zhí)行。意味著事務(wù)處理過(guò)程中的中間狀態(tài)對(duì)外部是不可見(jiàn)的

持久性:事務(wù)完成之后归榕,對(duì)數(shù)據(jù)的修改是永久性的


并發(fā)事務(wù)處理帶來(lái)的問(wèn)題:

更新丟失:兩個(gè)或多個(gè)事務(wù)同時(shí)選擇一行并更新該行的數(shù)據(jù)尸红,最后的更新覆蓋了由其他事務(wù)做的更新。

臟讀:一個(gè)事務(wù)正在對(duì)一條記錄進(jìn)行修改刹泄,在這個(gè)事務(wù)提交之前外里,其他事務(wù)過(guò)來(lái)了讀取了臟數(shù)據(jù)并進(jìn)一步做了處理,就會(huì)產(chǎn)生未提交的數(shù)據(jù)依賴(lài)關(guān)系特石。??

不可重復(fù)讀:一個(gè)數(shù)據(jù)在讀取某些數(shù)據(jù)后的某個(gè)時(shí)間盅蝗,再次讀取以前讀過(guò)的數(shù)據(jù),會(huì)發(fā)現(xiàn)其讀出的數(shù)據(jù)發(fā)生了變化或者被刪除

幻讀:一個(gè)事務(wù)按相同的查詢(xún)條件重新讀取以前檢索過(guò)的數(shù)據(jù)姆蘸,發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢(xún)條件的新數(shù)據(jù)


事務(wù)隔離級(jí)別:

更新丟失問(wèn)題通常是應(yīng)該完全避免的墩莫,并不能只靠數(shù)據(jù)庫(kù)的事務(wù)控制器解決,需要應(yīng)用程序?qū)σ碌臄?shù)據(jù)加必要的鎖來(lái)解決逞敷,防止更新丟失是應(yīng)用的責(zé)任

臟讀狂秦,不可重復(fù)讀,幻讀屬于數(shù)據(jù)庫(kù)讀一致性問(wèn)題推捐,必須由數(shù)據(jù)庫(kù)提供一定的事務(wù)隔離機(jī)制解決

1.? ? 在讀取數(shù)據(jù)前加鎖

2.不加鎖裂问,通過(guò)數(shù)據(jù)多版本并發(fā)控制

四種事務(wù)隔離級(jí)別:




表鎖:開(kāi)銷(xiāo)小,加鎖快牛柒,不會(huì)出現(xiàn)死鎖堪簿,并發(fā)度低,容易鎖沖突

行鎖:開(kāi)銷(xiāo)大焰络,加鎖慢,會(huì)出現(xiàn)死鎖符喝,并發(fā)度高闪彼,不容易鎖沖突


InnoDB使用兩種類(lèi)型的行鎖:

共享鎖S(鎖的是行):稱(chēng)為讀鎖,就是說(shuō)事務(wù)1對(duì)數(shù)據(jù)A加了S鎖,事務(wù)1只能讀不能修改A畏腕,其他事務(wù)也一樣只能讀不能寫(xiě)缴川,只能加S鎖不能加X(jué)鎖,除非事務(wù)1釋放S鎖

排他鎖X(du'de鎖的是行):稱(chēng)為寫(xiě)鎖描馅,事務(wù)1對(duì)數(shù)據(jù)加了X鎖把夸,能讀能寫(xiě),其他事務(wù)不能讀和寫(xiě)铭污,不能加任何鎖

意向共享鎖IS(鎖的是表):通知數(shù)據(jù)庫(kù)要加什么表并對(duì)表進(jìn)行加鎖恋日,如果需要對(duì)A進(jìn)行加共享鎖,先對(duì)該表加意向共享鎖后再對(duì)A加共享鎖

意向排他鎖IX(鎖的是表):同上

意向共享鎖和意向排他鎖都是由數(shù)據(jù)庫(kù)加的

InnoDB行鎖是通過(guò)給索引加鎖來(lái)實(shí)現(xiàn)的嘹狞,只有通過(guò)索引條件檢索數(shù)據(jù)才是使用行鎖岂膳,否則使用表鎖



間隙鎖:

當(dāng)我們用范圍t條件而不是相等條件檢索數(shù)據(jù)時(shí),并請(qǐng)求了共享鎖或者排他鎖磅网,InnoDB會(huì)給符合條件的已有數(shù)據(jù)記錄的索引項(xiàng)加鎖谈截,對(duì)于在范圍但是不存在的記錄,會(huì)加間隙鎖

目的:防止幻讀涧偷,滿足相關(guān)隔離級(jí)別的要求簸喂。因?yàn)橛锌赡茉谧x的過(guò)程其他事務(wù)插入了新的數(shù)據(jù),就會(huì)產(chǎn)生幻讀燎潮。

但這會(huì)造成嚴(yán)重的鎖等待喻鳄,因此要盡量使用相等條件來(lái)訪問(wèn)更新數(shù)據(jù),避免使用范圍條件


什么時(shí)候使用表鎖:

對(duì)于InnoDB表跟啤,在絕大部分情況下都應(yīng)該使用行級(jí)鎖诽表,因?yàn)槭聞?wù)和行鎖往往是我們之所以選擇InnoDB表的理由。但在個(gè)別特殊事務(wù)中隅肥,也可以考慮使用表級(jí)鎖竿奏。

第一種情況是:事務(wù)需要更新大部分或全部數(shù)據(jù),表又比較大腥放,如果使用默認(rèn)的行鎖泛啸,不僅這個(gè)事務(wù)執(zhí)行效率低,而且可能造成其他事務(wù)長(zhǎng)時(shí)間鎖等待和鎖沖突秃症,這種情況下可以考慮使用表鎖來(lái)提高該事務(wù)的執(zhí)行速度候址。

第二種情況是:事務(wù)涉及多個(gè)表,比較復(fù)雜种柑,很可能引起死鎖岗仑,造成大量事務(wù)回滾。這種情況也可以考慮一次性鎖定事務(wù)涉及的表聚请,從而避免死鎖荠雕、減少數(shù)據(jù)庫(kù)因事務(wù)回滾帶來(lái)的開(kāi)銷(xiāo)稳其。

當(dāng)然,應(yīng)用中這兩種事務(wù)不能太多炸卑,否則既鞠,就應(yīng)該考慮使用MyISAM表了。


避免死鎖的方法:

(1)在應(yīng)用中盖文,如果不同的程序會(huì)并發(fā)存取多個(gè)表嘱蛋,應(yīng)盡量約定以相同的順序來(lái)訪問(wèn)表,這樣可以大大降低產(chǎn)生死鎖的機(jī)會(huì)五续。

(2)在程序以批量方式處理數(shù)據(jù)的時(shí)候洒敏,如果事先對(duì)數(shù)據(jù)排序,保證每個(gè)線程按固定的順序來(lái)處理記錄返帕,也可以大大降低出現(xiàn)死鎖的可能桐玻。

(3)在事務(wù)中,如果要更新記錄荆萤,應(yīng)該直接申請(qǐng)足夠級(jí)別的鎖镊靴,即排他鎖,而不應(yīng)先申請(qǐng)共享鎖链韭,更新時(shí)再申請(qǐng)排他鎖偏竟,因?yàn)楫?dāng)用戶(hù)申請(qǐng)排他鎖時(shí),其他事務(wù)可能又已經(jīng)獲得了相同記錄的共享鎖敞峭,從而造成鎖沖突踊谋,甚至死鎖。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末旋讹,一起剝皮案震驚了整個(gè)濱河市殖蚕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌沉迹,老刑警劉巖睦疫,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鞭呕,居然都是意外死亡蛤育,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)葫松,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)瓦糕,“玉大人,你說(shuō)我怎么就攤上這事腋么」韭Γ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵珊擂,是天一觀的道長(zhǎng)圣勒。 經(jīng)常有香客問(wèn)我徐块,道長(zhǎng),這世上最難降的妖魔是什么灾而? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮扳剿,結(jié)果婚禮上旁趟,老公的妹妹穿的比我還像新娘。我一直安慰自己庇绽,他們只是感情好锡搜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瞧掺,像睡著了一般耕餐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上辟狈,一...
    開(kāi)封第一講書(shū)人閱讀 52,584評(píng)論 1 312
  • 那天肠缔,我揣著相機(jī)與錄音,去河邊找鬼哼转。 笑死明未,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的壹蔓。 我是一名探鬼主播趟妥,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼佣蓉!你這毒婦竟也來(lái)了披摄?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤勇凭,失蹤者是張志新(化名)和其女友劉穎疚膊,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體套像,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酿联,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夺巩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞让。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖柳譬,靈堂內(nèi)的尸體忽然破棺而出喳张,到底是詐尸還是另有隱情,我是刑警寧澤美澳,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布销部,位于F島的核電站摸航,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏舅桩。R本人自食惡果不足惜酱虎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擂涛。 院中可真熱鬧读串,春花似錦、人聲如沸撒妈。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)狰右。三九已至杰捂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棋蚌,已是汗流浹背嫁佳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谷暮,地道東北人脱拼。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像坷备,于是被迫代替她去往敵國(guó)和親熄浓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

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