Mysql的鎖機制

根據(jù)加鎖的粒度區(qū)分

  • 全局鎖
  • 表級鎖
  • 行鎖
    • 記錄鎖
    • 間隙鎖
    • 臨鍵鎖

根據(jù)加鎖的場景

  • 樂觀鎖
  • 悲觀鎖

全局鎖

鎖對象是:整個數(shù)據(jù)庫實例

<font color='red'>Flush tables with read lock (FTWRL)</font>-會讓整個庫處于只讀狀態(tài)

使用場景: 做全庫邏輯備份

全庫邏輯備份

為什么要進行全局鎖才能進行數(shù)據(jù)備份呢?

就比如售賣,我一張表記錄發(fā)貨,一張表記錄扣款.結(jié)果我在備份發(fā)貨記錄表.這個時候有人買東西了,只扣款了但是沒有發(fā)貨記錄.這個顯然是不行的

官方自帶的邏輯備份工具是mysqldump醇坝。當(dāng)mysqldump使用參數(shù)–single-transaction的時候凭疮,導(dǎo) 數(shù)據(jù)之前就會啟動一個事務(wù),來確保拿到一致性視圖铡俐。而由于MVCC的支持阱飘,這個過程中數(shù)據(jù)是 可以正常更新的斥杜。但是這個是基于事務(wù)的基礎(chǔ)上的,針對myisam數(shù)據(jù)引擎就不可用,那么就有可能出現(xiàn)有的表不是基于innoDB的數(shù)據(jù)引擎

當(dāng)然,如果全部都是innodb的數(shù)據(jù)引擎表,那么,還是使用默認的mysqldump增加參數(shù)–single-transaction來進行全局邏輯備份的好

FTWRL和set global readonly=true的區(qū)別

  1. readonly會在別的邏輯中參與使用(不同系統(tǒng)不一樣)
  2. ftwrl可以在客戶端鏈接斷開時,自動釋放鎖.防止造成死鎖問題

表級鎖

命令:lock table {tableName} read/write(write比read權(quán)限大,能write當(dāng)然能read),unlock table解鎖

鎖住的資源只允許當(dāng)前的線程可以執(zhí)行對應(yīng)的操作.且當(dāng)前線程只能對鎖住的表進行對應(yīng)的操作

例如:lock table t1 read,則當(dāng)前線程只能讀不能寫,其他線程不能讀不能寫

MDL鎖

不需要顯式使用,在訪問表時自動加上(為了防止表結(jié)構(gòu)變更帶來的問題)

在對一張表進行增刪改查時上MDL讀鎖,在對一張表的結(jié)構(gòu)進行變更時上MDL寫鎖

  • MDL讀鎖(共享鎖),鎖之間不互斥.所以可以允許多個線程進行同時的增刪改查
  • MDL寫鎖(排它鎖),這個鎖和其他讀寫鎖都互斥.也就是當(dāng)前數(shù)據(jù)變更或者查詢或者結(jié)構(gòu)變更,都必須等其他的MDL寫鎖釋放后才能執(zhí)行

行鎖

行鎖是引擎層,各個引擎自己實現(xiàn)的(MyISAM不支持行鎖,所以該引擎只能一次進行一個線程的update操作)

在事務(wù)中:行鎖會在需要使用某一行或多行數(shù)據(jù)時加上,但是所有的行鎖都會在該事務(wù)提交才會釋放也就是說,別的線程需要訪問改行數(shù)據(jù),就需要等待線程的事務(wù)提交之后才能訪問
舉例:

線程A執(zhí)行以下操作
begin;
update t1 set a=1 where id=1;

update t2 set b=2 where id=2;

commit

這個時候線程A分別對t1的id=1上鎖和t2的id=2上鎖.如果此時線程B訪問t1的id=1是無法訪問的,即使第一條語句已經(jīng)執(zhí)行完成了
線程B只有在線程A進行了commit操作之后才能獲取其中的數(shù)據(jù)

所以,對于我們來說需要注意的點就是:在進行事務(wù)操作時,如果update沒有順序操作,那么就盡量將訪問最多的那條語句最后執(zhí)行(因為上鎖是順序上的,但是釋放鎖是一起釋放的)

特點 表鎖 行鎖
加鎖層面 mysql的server層 數(shù)據(jù)引擎層
引擎 MyISAM、innoDB InnoDB
特點 不會死鎖沥匈、開銷小蔗喂、加鎖快、鎖粒度大 易死鎖高帖、開銷大缰儿、加鎖慢、鎖粒度小

死鎖

很多情況都回引起死鎖,大部分都是針對數(shù)據(jù)庫操作有問題才會導(dǎo)致.比如

線程A和線程B都針對id=1和id=2進行修改并開啟事務(wù)

線程A先修改了id=1導(dǎo)致id=1被線程A上鎖

線程B修改了id=2導(dǎo)致id=2被縣城B上鎖

此時線程A要等待id=2釋放鎖后執(zhí)行對id=2的操作
而線程B要等待id=1釋放鎖后懟id=1的操作

從而達到了一個循環(huán)死鎖的情況

處理這種問題有兩個策略:

  1. 直接進入等待散址,直到超時乖阵。這個超時時間可以通過參數(shù) innodb_lock_wait_timeout(默認50s)來設(shè)置宣赔。這個不能設(shè)置太短,如果不是死鎖呢?
  2. 發(fā)起死鎖檢測,發(fā)現(xiàn)死鎖后瞪浸,主動回滾死鎖鏈條中的某一個事務(wù)儒将,讓其他事 務(wù)得以繼續(xù)執(zhí)行。將參數(shù)innodb_deadlock_detect設(shè)置為on(默認就是on)对蒲,表示開啟這個邏輯钩蚊。

記錄鎖

屬于行鎖的一種情況

針對的是事務(wù)在加鎖后鎖住的某一條記錄信息

觸發(fā)情況:查詢條件精準(zhǔn)命中且命中的條件字段是唯一的
例如:update t1 set name="張三" where id=12138

作用:記錄在被當(dāng)前事務(wù)管理時,加上鎖之后不會被其他事務(wù)獲取產(chǎn)生“重復(fù)讀”和“數(shù)據(jù)臟讀”的問題

間隙鎖

屬于行鎖的一種情況

間隙的意思就是between中的數(shù)據(jù)



在主鍵索引id中有多個數(shù)據(jù)未填充,這個時候如果兩個線程A和B,A在查詢0-10之間的數(shù)據(jù),而B在往id=3插入數(shù)據(jù),就會造成數(shù)據(jù)臟讀的問題



所以在進行between等范圍查找的是事務(wù)時候,會加間隙鎖進行約束

臨鍵鎖

臨鍵鎖會把查詢出來的記錄鎖住,同時也會把該范圍查詢內(nèi)的所有間隙空間也會鎖住蹈矮,再之它會把相鄰的下一個區(qū)間也會鎖住砰逻。
(臨就是相鄰的意思)

樂觀鎖和悲觀鎖

概念 樂觀鎖 悲觀鎖
概念 假定不會發(fā)生并發(fā)沖突
只在提交時判斷下是否有數(shù)據(jù)問題
假定會發(fā)生并發(fā)沖突
從而上鎖
實現(xiàn)層面 業(yè)務(wù)代碼層面,自己實現(xiàn)
(需要結(jié)合具體業(yè)務(wù)邏輯)
mysql數(shù)據(jù)庫自身實現(xiàn)
并發(fā)情況 并發(fā)大 并發(fā)小
實現(xiàn)方式 在數(shù)據(jù)庫中增加版本號字段,
提交時判斷操作前的版本號和當(dāng)前版本號是否一致
共享鎖:select lock xxxxxx
排它鎖:select xxxx for update
其他 mysql中的synchronized其實就是排它鎖
共享鎖:運行其他線程不允許增刪改
排它鎖:增刪改都不允許
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市泛鸟,隨后出現(xiàn)的幾起案子蝠咆,更是在濱河造成了極大的恐慌,老刑警劉巖北滥,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刚操,死亡現(xiàn)場離奇詭異,居然都是意外死亡再芋,警方通過查閱死者的電腦和手機赡茸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來祝闻,“玉大人,你說我怎么就攤上這事遗菠×” “怎么了?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵辙纬,是天一觀的道長豁遭。 經(jīng)常有香客問我,道長贺拣,這世上最難降的妖魔是什么蓖谢? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮譬涡,結(jié)果婚禮上闪幽,老公的妹妹穿的比我還像新娘。我一直安慰自己涡匀,他們只是感情好盯腌,可當(dāng)我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著陨瘩,像睡著了一般腕够。 火紅的嫁衣襯著肌膚如雪级乍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天帚湘,我揣著相機與錄音玫荣,去河邊找鬼。 笑死大诸,一個胖子當(dāng)著我的面吹牛捅厂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播底挫,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼恒傻,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了建邓?” 一聲冷哼從身側(cè)響起盈厘,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎官边,沒想到半個月后沸手,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡注簿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年契吉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡渴。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捐晶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出妄辩,到底是詐尸還是另有隱情惑灵,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布眼耀,位于F島的核電站英支,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏哮伟。R本人自食惡果不足惜干花,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楞黄。 院中可真熱鬧池凄,春花似錦、人聲如沸谅辣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柏副,卻和暖如春勾邦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背割择。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工眷篇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荔泳。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓蕉饼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親玛歌。 傳聞我的和親對象是個殘疾皇子昧港,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,700評論 2 354

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

  • 鎖是計算機協(xié)調(diào)多個進程或線程并發(fā)訪問某一資源的機制。數(shù)據(jù)庫鎖設(shè)計的初衷是處理并發(fā)問題支子。作為多用戶共享的資源创肥,當(dāng)出現(xiàn)...
    _code_x閱讀 252評論 0 1
  • 鎖概述 MySQL的鎖機制,就是數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性而設(shè)計的面對并發(fā)場景的一種規(guī)則值朋。 最顯著的特點是不同的存...
    胡一巴閱讀 433評論 0 0
  • 鎖概述 MySQL的鎖機制叹侄,就是數(shù)據(jù)庫為了保證數(shù)據(jù)的一致性而設(shè)計的面對并發(fā)場景的一種規(guī)則。 最顯著的特點是不同的存...
    胡一巴閱讀 246評論 0 0
  • 本篇作為學(xué)習(xí)筆記昨登,文章內(nèi)容來自“極客時間”專欄《MySQL實戰(zhàn)45講》趾代,如有侵權(quán),請告知丰辣,必即時刪除撒强。 根據(jù)加鎖的...
    JBryan閱讀 375評論 0 0
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險笙什,但是人生放棄了冒險尿褪,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,049評論 0 4