6. Mysql全局鎖和表級(jí)鎖

數(shù)據(jù)庫鎖設(shè)計(jì)的初衷是處理并發(fā)問題。作為多用戶共享的資源纲刀,當(dāng)出現(xiàn)并發(fā)訪問的時(shí)候项炼,數(shù)據(jù)庫需要合理地控制資源的訪問規(guī)則。而鎖就是用來實(shí)現(xiàn)這些訪問規(guī)則的重要數(shù)據(jù)結(jié)構(gòu)示绊。

根據(jù)加鎖的范圍锭部,mysql里面的鎖大致分為3類: 全局鎖,表級(jí)鎖面褐,行鎖拌禾。

全局鎖:就是對(duì)整個(gè)數(shù)據(jù)庫實(shí)例加鎖。加全局讀鎖的方法展哭,F(xiàn)TWRL(flush tables with read lock)湃窍,使用這個(gè)命令之后,整個(gè)庫處于只讀狀態(tài)摄杂,其他線程的一下語句會(huì)被阻塞:數(shù)據(jù)跟新語句(數(shù)據(jù)的增刪改)坝咐,數(shù)據(jù)定義語句(包括建表,修改表結(jié)構(gòu))析恢,跟新類事務(wù)的提交語句墨坚。

全局鎖的典型使用場(chǎng)景是,做全庫邏輯備份(把整個(gè)庫都select出來存成文本)映挂。Mysql自帶的邏輯備份工具是mysqldump泽篮,當(dāng)mysqldump使用參數(shù)--single-transation的時(shí)候,到數(shù)據(jù)之前就會(huì)啟動(dòng)一個(gè)事務(wù)柑船,來確保拿到一個(gè)一致性視圖帽撑。一致性讀(single-transation)的方法只適用于所有的表使用事務(wù)引擎的庫,如果有的表使用了不支持事務(wù)的引擎(例如 MyISAM)那么備份就只能通過FTWRL的方法實(shí)現(xiàn)鞍时。

為什么不使用set global readonly=true的方式將全庫設(shè)置為只讀亏拉?1. 在有些系統(tǒng)中,readonly的值會(huì)被用于來作其他邏輯逆巍,例如用來判斷一個(gè)庫是主庫還是備庫及塘,如果修改了這個(gè)全局變量,可能會(huì)造成其他影響锐极。2笙僚,Mysql在readonly和FTWRL在異常處理機(jī)制上不同。如果執(zhí)行FTWRL命令之后由于客戶端異常斷開連接灵再,Mysql會(huì)自動(dòng)釋放這個(gè)全局鎖肋层,整個(gè)庫回到可以正常跟新的狀態(tài)亿笤;但是把數(shù)據(jù)庫設(shè)置為readonly之后,如果客戶端發(fā)生異常栋猖,數(shù)據(jù)庫就會(huì)一直保持readonly狀態(tài)净薛,庫將處于不可寫狀態(tài)。

Mysql中的表級(jí)鎖有兩種:表鎖掂铐,元數(shù)據(jù)鎖(metadata lock MDL)

表鎖的語法是lock tables *** read/write罕拂。與FTWRL類似,可以用unlock table主動(dòng)釋放鎖全陨,也可以在客戶端斷開連接的時(shí)候自動(dòng)釋放爆班。lock table語法會(huì)限制本線程接下來的操作對(duì)象,也會(huì)限制別的線程的讀寫辱姨。

舉個(gè)例子, 如果在某個(gè)線程 A 中執(zhí)行 lock tablet1 read, t2 write; 這個(gè)語句柿菩,則其他線程寫t1、讀寫 t2 的語句都會(huì)被阻塞雨涛。同時(shí)枢舶,線程 A 在執(zhí)行unlock tables 之前,也只能執(zhí)行讀 t1替久、讀寫t2 的操作凉泄。連寫 t1 都不允許,自然也不能訪問其他表蚯根。后众??颅拦?蒂誉??

另一類表級(jí)鎖是MDL(metadata lock)MDL不需要顯示使用距帅,為了保證讀寫的正確性右锨,在訪問一個(gè)表的時(shí)候會(huì)被自動(dòng)加上。Mysql5.5之后碌秸,當(dāng)對(duì)一個(gè)表作怎刪改查操作的時(shí)候绍移,加MDL讀鎖,當(dāng)對(duì)表作結(jié)構(gòu)變更操作的時(shí)候讥电,加MDL寫鎖登夫。

讀鎖之間不互斥,因此可以有多個(gè)線程同時(shí)對(duì)一個(gè)表怎刪改查允趟。

讀寫鎖之間,寫鎖之間是互斥的鸦致,用來保證變更表結(jié)構(gòu)操作的安全性潮剪。如果有兩個(gè)線程要同時(shí)給一個(gè)表加字段涣楷,其中一個(gè)要等另一個(gè)執(zhí)行完才能開始執(zhí)行。

如何安全地給小表加字段抗碰?

首先要解決長事務(wù)狮斗,事務(wù)不提交,就會(huì)一直占著MDL鎖弧蝇。在mysql的information_schema庫中的innodb_trx表中碳褒,可以查到當(dāng)前執(zhí)行的事務(wù),如果在執(zhí)行DDL的表剛好有長事務(wù)在執(zhí)行看疗,需要先暫停DDL沙峻,或者kill掉這個(gè)長事務(wù)。但是如果是個(gè)常被訪問的表两芳,kill操作也未必管用摔寨,新的請(qǐng)求馬上就來了,比較理想的做法是怖辆,在alter table語句中設(shè)定一個(gè)等待時(shí)間是复,如果在規(guī)定時(shí)間內(nèi)能拿到MDL寫鎖最好,如果沒有拿到也不會(huì)阻塞后面的業(yè)務(wù)語句竖螃。

innodb trx

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ALTER TABLE tbl_name NOWAIT add column ...

??????????????????????????????????????????????????????????????ALTER TABLE tbl_name WAIT N add column ...

FTWRL 前有讀寫的話淑廊,F(xiàn)TWRL 都會(huì)等待讀寫執(zhí)行完畢后才執(zhí)行。

FTWRL 執(zhí)行的時(shí)候要刷臟頁的數(shù)據(jù)到磁盤特咆,因?yàn)橐3謹(jǐn)?shù)據(jù)的一致性 季惩,理解的執(zhí)行FTWRL時(shí)候是所有事務(wù)都提交完畢的時(shí)候。

mysqldump + -single-transaction 也是保證事務(wù)的一致性,但他只針對(duì) 有支持事務(wù) 引擎坚弱,比如 innodb蜀备,所以 還是強(qiáng)烈建議大家在創(chuàng)建實(shí)例,表時(shí)候需要innodb 引擎為好荒叶。

全庫只讀 readonly = true 還有個(gè)情況在 slave上如果用戶有超級(jí)權(quán)限的話 readonly 是失效的

表級(jí)別鎖 :一個(gè)直接就是表鎖 lock table 建議不要使用, 影響太大碾阁,另個(gè)就是 MDL 元數(shù)據(jù)鎖

MDL 是并發(fā)情況下維護(hù)數(shù)據(jù)的一致性,在表上有事務(wù)的時(shí)候,不可以對(duì)元數(shù)據(jù)經(jīng)行寫入操作,并且這個(gè)是在server層面實(shí)現(xiàn)的

當(dāng)你做 dml 時(shí)候增加的 MDL 讀鎖, update table set id=Y where id=X; 并且由于隔離級(jí)別的原因 讀鎖之間不沖突

當(dāng)你DDL 時(shí)候 增加對(duì)表的寫鎖, 同時(shí)操作兩個(gè)alter table 操作 這個(gè)要出現(xiàn)等待情況。

但是 如果是 dml 與ddl 之間的交互 就更容易出現(xiàn)不可讀寫情況,這個(gè)情況容易session 爆滿,session是占用內(nèi)存的,也會(huì)導(dǎo)致內(nèi)存升高

MDL 釋放的情況就是 事務(wù)提交.

主庫上的一個(gè)小表做了一個(gè) DDL, 同步給slave ,由于這個(gè)時(shí)候有了先前的 single-transaction,所以slave 就會(huì)出現(xiàn) 該表的 鎖等待, 并且slave 出現(xiàn)延遲

MDL作用是防止DDL和DML并發(fā)的沖突些楣,個(gè)人感覺應(yīng)該寫清楚脂凶,一開始理解為select和update之間的并發(fā)。

Online DDL的過程是這樣的:

1. 拿MDL寫鎖

2. 降級(jí)成MDL讀鎖

3. 真正做DDL

4. 升級(jí)成MDL寫鎖

5. 釋放MDL鎖

1愁茁、2蚕钦、4、5如果沒有鎖沖突鹅很,執(zhí)行時(shí)間非常短嘶居。第3步占用了DDL絕大部分時(shí)間,這期間這個(gè)表可以正常讀寫數(shù)據(jù),是因此稱為“online ”

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邮屁,一起剝皮案震驚了整個(gè)濱河市整袁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佑吝,老刑警劉巖坐昙,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異芋忿,居然都是意外死亡炸客,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門戈钢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來痹仙,“玉大人,你說我怎么就攤上這事逆趣〉埽” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵宣渗,是天一觀的道長抖所。 經(jīng)常有香客問我,道長痕囱,這世上最難降的妖魔是什么田轧? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鞍恢,結(jié)果婚禮上傻粘,老公的妹妹穿的比我還像新娘。我一直安慰自己帮掉,他們只是感情好弦悉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟆炊,像睡著了一般稽莉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩搓,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天污秆,我揣著相機(jī)與錄音,去河邊找鬼昧甘。 笑死良拼,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的充边。 我是一名探鬼主播庸推,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了予弧?” 一聲冷哼從身側(cè)響起刮吧,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掖蛤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體井厌,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蚓庭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仅仆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片器赞。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖墓拜,靈堂內(nèi)的尸體忽然破棺而出港柜,到底是詐尸還是另有隱情,我是刑警寧澤咳榜,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布夏醉,位于F島的核電站,受9級(jí)特大地震影響涌韩,放射性物質(zhì)發(fā)生泄漏畔柔。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一臣樱、第九天 我趴在偏房一處隱蔽的房頂上張望靶擦。 院中可真熱鬧,春花似錦雇毫、人聲如沸玄捕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枚粘。三九已至,卻和暖如春席吴,著一層夾襖步出監(jiān)牢的瞬間赌结,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國打工孝冒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留柬姚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓庄涡,卻偏偏與公主長得像量承,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • ORA-00001: 違反唯一約束條件 (.) 錯(cuò)誤說明:當(dāng)在唯一索引所對(duì)應(yīng)的列上鍵入重復(fù)值時(shí)撕捍,會(huì)觸發(fā)此異常拿穴。 O...
    我想起個(gè)好名字閱讀 5,311評(píng)論 0 9
  • 全局鎖 對(duì)整個(gè)數(shù)據(jù)庫實(shí)例加鎖 使用場(chǎng)景:做全庫邏輯備份時(shí),為了保證備份期間的庫在同一個(gè)邏輯時(shí)間點(diǎn)忧风,即一致性視圖(類...
    Java大寶寶閱讀 856評(píng)論 0 1
  • 全局鎖 對(duì)整個(gè)庫實(shí)例加鎖狮腿。讓整個(gè)庫處于只讀狀態(tài)的時(shí)候腿宰,可以使用這個(gè)命令,之后其他線程的以下語句會(huì)被阻塞:增刪改缘厢、建...
    胖達(dá)_4b7e閱讀 523評(píng)論 0 0
  • 摘要:一贴硫、故障描述 今天一個(gè)朋友遇到數(shù)據(jù)庫遇到一個(gè)嚴(yán)重的故障椿每,故障環(huán)境如下: MYSQL 5.6.16 RR隔離級(jí)...
    暖夏未眠丶閱讀 688評(píng)論 0 1
  • 這是第三遍看《和莎莫的500天》(500 days of summer)了。雖然我一直覺得片名的翻譯很有奇異感英遭,但...
    送你一朵西蘭花閱讀 444評(píng)論 0 0