mysql的鎖
根據加鎖范圍:MySQL里面的鎖可以分為:全局鎖、表級鎖鳞青、行級
一臂拓、全局鎖:
對整個數據庫實例加鎖。
MySQL提供加全局讀鎖的方法:Flush tables with read lock(FTWRL)
這個命令可以使整個庫處于只讀狀態(tài)胶惰。使用該命令之后孵滞,數據更新語句坊饶、數據定義語句和更新類事務的提交語句等操作都會被阻塞殴蓬。
使用場景:全庫邏輯備份。
風險:
1.如果在主庫備份根蟹,在備份期間不能更新糟秘,業(yè)務停擺
2.如果在從庫備份球散,備份期間不能執(zhí)行主庫同步的binlog,導致主從延遲
官方自帶的邏輯備份工具mysqldump悲龟,當mysqldump使用參數--single-transaction的時候,會啟動一個事務须教,確保拿到一致性視圖轻腺。而由于MVCC的支持划乖,這個過程中數據是可以正常更新的。一致性讀是好琴庵,但是前提是引擎要支持這個隔離級別误算。
如果要全庫只讀,為什么不使用set global readonly=true的方式迷殿?
1.在有些系統(tǒng)中儿礼,readonly的值會被用來做其他邏輯,比如判斷主備庫庆寺。所以修改global變量的方式影響太大蜘犁。
2.在異常處理機制上有差異。如果執(zhí)行FTWRL命令之后由于客戶端發(fā)生異常斷開止邮,那么MySQL會自動釋放這個全局鎖这橙,整個庫回到可以正常更新的狀態(tài)。而將整個庫設置為readonly之后导披,如果客戶端發(fā)生異常屈扎,則數據庫就會一直保持readonly狀態(tài),這樣會導致整個庫長時間處于不可寫狀態(tài)撩匕,風險較高鹰晨。
二模蜡、表級鎖
MySQL里面表級鎖有兩種,一種是表鎖甥绿,一種是元數據鎖(meta data lock,MDL)
表鎖的語法是:lock tables ... read/write
可以用unlock tables主動釋放鎖共缕,也可以在客戶端斷開的時候自動釋放。lock tables語法除了會限制別的線程的讀寫外,也限定了本線程接下來的操作對象嫉沽。
對于InnoDB這種支持行鎖的引擎,一般不使用lock tables命令來控制并發(fā)玻佩,畢竟鎖住整個表的影響面還是太大。
MDL:不需要顯式使用,在訪問一個表的時候會被自動加上兜蠕。
MDL的作用:保證讀寫的正確性。
在對一個表做增刪改查操作的時候晶府,加MDL讀鎖;當要對表做結構變更操作的時候,加MDL寫鎖。
讀鎖之間不互斥骡苞。讀寫鎖之間,寫鎖之間是互斥的躲株,用來保證變更表結構操作的安全性。
MDL 會直到事務提交才會釋放,在做表結構變更的時候磨德,一定要小心不要導致鎖住線上查詢和更新。
三搔弄、行鎖
兩階段鎖:在 InnoDB 事務中,行鎖是在需要的時候才加上的炫刷,但并不是不需要了就立刻釋放顾彰, 而是要等到事務結束時才釋放筋搏。
建議:如果你的事務中需要鎖多個行,要把最可能造成鎖沖突髓迎、最可能影響并發(fā)度的鎖盡量往后放。
死鎖:當并發(fā)系統(tǒng)中不同線程出現循環(huán)資源依賴,涉及的線程都在等待別的線程釋放資源時挣郭,就會導致這幾個線程都進入無限等待的狀態(tài)蕉汪。
解決方案:
1、通過參數 innodb_lock_wait_timeout 根據實際業(yè)務場景來設置超時時間,InnoDB引擎默認值是50s算利。
2、發(fā)起死鎖檢測慕的,發(fā)現死鎖后蚂蕴,主動回滾死鎖鏈條中的某一個事務骡楼,讓其他事務得以繼續(xù)執(zhí)行篮条。將參數 innodb_deadlock_detect 設置為 on伴栓,表示開啟這個邏輯(默認是開啟狀態(tài))饺窿。
如何解決熱點行更新導致的性能問題忍宋?
1入宦、如果你能確保這個業(yè)務一定不會出現死鎖涯肩,可以臨時把死鎖檢測關閉掉硫朦。一般不建議采用
2泽裳、控制并發(fā)度瀑梗,對應相同行的更新铺纽,在進入引擎之前排隊其馏。這樣在InnoDB內部就不會有大量的死鎖檢測工作了咖耘。
3、將熱更新的行數據拆分成邏輯上的多行來減少鎖沖突,但是業(yè)務復雜度可能會大大提高谤民。
innodb行級鎖是通過鎖索引記錄實現的,如果更新的列沒建索引是會鎖住整個表的。
mysql學習day3
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
- 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乒融,你說我怎么就攤上這事。” “怎么了?”我有些...
- 文/不壞的土叔 我叫張陵禾进,是天一觀的道長宠纯。 經常有香客問我,道長马澈,這世上最難降的妖魔是什么涤伐? 我笑而不...
- 正文 為了忘掉前任馒胆,我火速辦了婚禮,結果婚禮上凝果,老公的妹妹穿的比我還像新娘祝迂。我一直安慰自己,他們只是感情好器净,可當我...
- 文/花漫 我一把揭開白布型雳。 她就那樣靜靜地躺著,像睡著了一般山害。 火紅的嫁衣襯著肌膚如雪四啰。 梳的紋絲不亂的頭發(fā)上,一...
- 文/蒼蘭香墨 我猛地睜開眼涌庭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了欧宜?” 一聲冷哼從身側響起坐榆,我...
- 正文 年R本政府宣布践付,位于F島的核電站秦士,受9級特大地震影響,放射性物質發(fā)生泄漏荔仁。R本人自食惡果不足惜伍宦,卻給世界環(huán)境...
- 文/蒙蒙 一芽死、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧次洼,春花似錦关贵、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至亥啦,卻和暖如春炭剪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背翔脱。 一陣腳步聲響...
推薦閱讀更多精彩內容
- 原文: MySQL系統(tǒng)學習(06):MySQL的全局鎖痴施、表級鎖以及行鎖[http://www.wangqi94.c...
- 1. 概述 這一章主要講到了全局鎖和表鎖辣吃,介紹了碰到鎖時的現象和其背后的原理。 2. 總結 2.1 MySQL 里...