mysql學(xué)習(xí)筆記五:鎖

全局鎖

全局鎖就是對(duì)整個(gè)數(shù)據(jù)庫(kù)實(shí)例加鎖,

實(shí)現(xiàn)一:命令是 Flush tables with read lock (FTWRL)黍图,讓整個(gè)庫(kù)處于只讀狀態(tài)的時(shí)候顽馋,使用場(chǎng)景:引擎不支持事務(wù)和措,做數(shù)據(jù)庫(kù)備份

實(shí)現(xiàn)二:mysqldump 使用參數(shù)–single-transaction,通過(guò)視圖求冷,需要數(shù)據(jù)庫(kù)支持事務(wù):innodb

表級(jí)鎖

實(shí)現(xiàn)一:表鎖朽褪, lock tables … read/write語(yǔ)法,與FTWRL類(lèi)似犁嗅,可以用unlock tables 主動(dòng)釋放边涕,與客戶(hù)端斷開(kāi)的時(shí)候自動(dòng)釋放。
缺點(diǎn):對(duì)于 InnoDB 這種支持行鎖的引擎褂微,一般不使用 lock tables 命令來(lái)控制并發(fā)功蜓,畢竟鎖住整個(gè)表的影響面還是太大。

實(shí)現(xiàn)二:元數(shù)據(jù)鎖MDL(metadata lock)宠蚂,MDL 不需要顯式使用式撼,在訪(fǎng)問(wèn)一個(gè)表的時(shí)候會(huì)被自動(dòng)加上。當(dāng)對(duì)一個(gè)表做增刪改查操作的時(shí)候求厕,加 MDL 讀鎖著隆;當(dāng)要對(duì)表做結(jié)構(gòu)變更操作的時(shí)候,加 MDL 寫(xiě)鎖呀癣。
1.讀鎖之間不互斥美浦,因此你可以有多個(gè)線(xiàn)程同時(shí)對(duì)一張表增刪改查。
2.讀寫(xiě)鎖之間项栏、寫(xiě)鎖之間是互斥的浦辨,用來(lái)保證變更表結(jié)構(gòu)操作的安全性。因此忘嫉,如果有兩個(gè)線(xiàn)程要同時(shí)給一個(gè)表加字段荤牍,其中一個(gè)要等另一個(gè)執(zhí)行完才能開(kāi)始執(zhí)行案腺。

例:給一個(gè)小表加個(gè)字段庆冕,導(dǎo)致整個(gè)庫(kù)掛了。


image.png

1.session A 先啟動(dòng)劈榨,這時(shí)候會(huì)對(duì)表 t 加一個(gè) MDL 讀鎖访递。由于 session B 需要的也是 MDL 讀鎖,因此可以正常執(zhí)行同辣。
2.session C 會(huì)被 blocked拷姿,是因?yàn)?session A 的 MDL 讀鎖還沒(méi)有釋放惭载,而 session C 需要 MDL 寫(xiě)鎖,因此只能被阻塞响巢。
3.如果只有 session C 自己被阻塞還沒(méi)什么關(guān)系描滔,但是之后所有要在表 t 上新申請(qǐng) MDL 讀鎖的請(qǐng)求也會(huì)被 session C 阻塞。前面我們說(shuō)了踪古,所有對(duì)表的增刪改查操作都需要先申請(qǐng) MDL 讀鎖含长,就都被鎖住,等于這個(gè)表現(xiàn)在完全不可讀寫(xiě)了伏穆。
4.如果某個(gè)表上的查詢(xún)語(yǔ)句頻繁拘泞,而且客戶(hù)端有重試機(jī)制,也就是說(shuō)超時(shí)后會(huì)再起一個(gè)新 session 再請(qǐng)求的話(huà)枕扫,這個(gè)庫(kù)的線(xiàn)程很快就會(huì)爆滿(mǎn)

如何安全地給小表加字段:
1.如果你要做 DDL 變更的表剛好有長(zhǎng)事務(wù)在執(zhí)行陪腌,要考慮先暫停 DDL,或者 kill 掉這個(gè)長(zhǎng)事務(wù)烟瞧。
2.在 alter table 語(yǔ)句里面設(shè)定等待時(shí)間(MariaDB合并了 AliSQL 的這個(gè)功能诗鸭, 支持 DDL NOWAIT/WAIT n 這個(gè)語(yǔ)法。)燕刻。

行鎖

行鎖就是針對(duì)數(shù)據(jù)表中行記錄的鎖只泼,比如事務(wù) A 更新了一行,而這時(shí)候事務(wù) B 也要更新同一行卵洗,則必須等事務(wù) A 的操作完成后才能進(jìn)行更新请唱。

MySQL 的行鎖是在引擎層由各個(gè)引擎自己實(shí)現(xiàn)的。但并不是所有的引擎都支持行鎖过蹂,比如 MyISAM 引擎就不支持行鎖十绑。不支持行鎖意味著并發(fā)控制只能使用表鎖,對(duì)于這種引擎的表酷勺,同一張表上任何時(shí)刻只能有一個(gè)更新在執(zhí)行本橙,這就會(huì)影響到業(yè)務(wù)并發(fā)度。InnoDB 是支持行鎖的脆诉,這也是 MyISAM 被 InnoDB 替代的重要原因之一甚亭。

兩階段鎖:

在 InnoDB 事務(wù)中,行鎖是在需要的時(shí)候才加上的击胜,但并不是不需要了就立刻釋放亏狰,而是要等到事務(wù)結(jié)束時(shí)才釋放。

例:事務(wù) B 的 update 語(yǔ)句會(huì)被阻塞偶摔,直到事務(wù) A 執(zhí)行 commit 之后暇唾,事務(wù) B 才能繼續(xù)執(zhí)行。


image.png

mysql優(yōu)化思路:如果你的事務(wù)中需要鎖多個(gè)行,要把最可能造成鎖沖突策州、最可能影響并發(fā)度的鎖盡量往后放瘸味。

死鎖和死鎖檢測(cè)

當(dāng)并發(fā)系統(tǒng)中不同線(xiàn)程出現(xiàn)循環(huán)資源依賴(lài),涉及的線(xiàn)程都在等待別的線(xiàn)程釋放資源時(shí)够挂,就會(huì)導(dǎo)致這幾個(gè)線(xiàn)程都進(jìn)入無(wú)限等待的狀態(tài)旁仿,稱(chēng)為死鎖。

例:事務(wù) A 在等待事務(wù) B 釋放 id=2 的行鎖孽糖,而事務(wù) B 在等待事務(wù) A 釋放 id=1 的行鎖丁逝。 事務(wù) A 和事務(wù) B 在互相等待對(duì)方的資源釋放,就是進(jìn)入了死鎖狀態(tài)梭姓。


image.png

解決策略:
1.通過(guò)參數(shù) innodb_lock_wait_timeout 來(lái)設(shè)置等待超時(shí)時(shí)間霜幼。

2。死鎖檢測(cè)誉尖,將參數(shù) innodb_deadlock_detect 設(shè)置為 on罪既,發(fā)現(xiàn)死鎖后,主動(dòng)回滾死鎖鏈條中的某一個(gè)事務(wù)铡恕,讓其他事務(wù)得以繼續(xù)執(zhí)行琢感。

3.其他:a.控制并發(fā)度,需要足夠的團(tuán)隊(duì)開(kāi)發(fā)mysql引擎探熔。b.把一個(gè)業(yè)務(wù)拆分多個(gè)表驹针,隨機(jī)對(duì)其中一個(gè)表修改。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末诀艰,一起剝皮案震驚了整個(gè)濱河市柬甥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌其垄,老刑警劉巖苛蒲,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绿满,居然都是意外死亡臂外,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)喇颁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漏健,“玉大人,你說(shuō)我怎么就攤上這事橘霎∧杞” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵茎毁,是天一觀的道長(zhǎng)克懊。 經(jīng)常有香客問(wèn)我,道長(zhǎng)七蜘,這世上最難降的妖魔是什么谭溉? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮橡卤,結(jié)果婚禮上扮念,老公的妹妹穿的比我還像新娘。我一直安慰自己碧库,他們只是感情好柜与,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著嵌灰,像睡著了一般弄匕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沽瞭,一...
    開(kāi)封第一講書(shū)人閱讀 52,328評(píng)論 1 310
  • 那天迁匠,我揣著相機(jī)與錄音,去河邊找鬼驹溃。 笑死城丧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的豌鹤。 我是一名探鬼主播亡哄,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼布疙!你這毒婦竟也來(lái)了蚊惯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤灵临,失蹤者是張志新(化名)和其女友劉穎拣挪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體俱诸,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡菠劝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了睁搭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赶诊。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖园骆,靈堂內(nèi)的尸體忽然破棺而出舔痪,到底是詐尸還是另有隱情,我是刑警寧澤锌唾,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布锄码,位于F島的核電站夺英,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滋捶。R本人自食惡果不足惜痛悯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望重窟。 院中可真熱鬧载萌,春花似錦、人聲如沸巡扇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)厅翔。三九已至乖坠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刀闷,已是汗流浹背瓤帚。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涩赢,地道東北人戈次。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像筒扒,于是被迫代替她去往敵國(guó)和親怯邪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359

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