《MysSQL自學(xué)筆記》之鎖

數(shù)據(jù)庫(kù)鎖

image.png
  • 表鎖:開(kāi)銷(xiāo)小大诸,加鎖快;不會(huì)出現(xiàn)死鎖贯卦;鎖定力度大,發(fā)生鎖沖突概率高焙贷,并發(fā)度最低
  • 行鎖:開(kāi)銷(xiāo)大撵割,加鎖慢;會(huì)出現(xiàn)死鎖辙芍;鎖定粒度小啡彬,發(fā)生鎖沖突的概率低羹与,并發(fā)度高
  • InnoDB行鎖和表鎖都支持!InnoDB只有通過(guò)索引條件檢索數(shù)據(jù)才使用行級(jí)鎖
  • MyISAM只支持表鎖庶灿!

MyISAM表級(jí)鎖

MySQL 的表級(jí)鎖有兩種模式:表共享讀鎖纵搁、表獨(dú)占寫(xiě)鎖
讀讀不阻塞,讀寫(xiě)阻塞往踢,寫(xiě)寫(xiě)阻塞
讀鎖和寫(xiě)鎖是互斥的腾誉,讀寫(xiě)操作是串行
對(duì) MyISAM 表的讀操作,不會(huì)阻塞其他用戶對(duì)同一表的讀請(qǐng)求峻呕,但會(huì)阻塞對(duì)同一表的寫(xiě)請(qǐng)求利职;對(duì) MyISAM 表的寫(xiě)操作,則會(huì)阻塞其他用戶對(duì)同一表的讀和寫(xiě)操作瘦癌。當(dāng)一個(gè)線程獲得對(duì)一個(gè)表的寫(xiě)鎖后猪贪,只有持有鎖的線程可以對(duì)表進(jìn)行更新操作。其他線程的讀讯私、寫(xiě)操作都會(huì)等待热押,直到鎖被釋放為止。

session_1 session_2
獲得text表的鎖定:
mysql> lock table text write;
當(dāng)前 session 對(duì)text表的查詢斤寇、更新桶癣、插入操作都可以執(zhí)行 session2對(duì)于text表的查詢、更新抡驼、插入操作都得阻塞等待
釋放鎖:
unlock tables;
等待
session_2的操作得到執(zhí)行
如何給MyISAM加表鎖

MyISAM 在執(zhí)行查詢語(yǔ)句(SELECT)前鬼廓,會(huì)自動(dòng)給涉及的所有表加讀鎖,在執(zhí)行更新操作(UPDATE致盟、DELETE碎税、INSERT 等)前,會(huì)自動(dòng)給涉及的表加寫(xiě)鎖馏锡,這個(gè)過(guò)程并不需要用戶干預(yù)雷蹂,因此,用戶一般不需要直接用 LOCK TABLE 命令給 MyISAM 表顯式加鎖杯道。
但有些特殊需求下需要我們手動(dòng)加表鎖匪煌。舉個(gè)例子:例如訂單表記錄了訂單的總金額,訂單詳細(xì)表記錄了訂單中各個(gè)商品的價(jià)格党巾,現(xiàn)在需要比對(duì)訂單總金額跟訂單詳細(xì)表金額的總價(jià)是否正確萎庭。

select sum(total) from orders;
select sum(subtotal) from order_detail;
比對(duì) toatal 和 total_deail

這時(shí)候就需要手動(dòng)將order,order_detail手動(dòng)加鎖,不然查詢時(shí)又有新的記錄插入會(huì)導(dǎo)致比對(duì)不一致齿拂。

Lock tables orders read local, order_detail read local;
Select sum(total) from orders;
Select sum(subtotal) from order_detail;
Unlock tables;

注意點(diǎn):

  • 在執(zhí)行 LOCK TABLES 后驳规,只能訪問(wèn)顯式加鎖的這些表,不能訪問(wèn)未加鎖的表
  • 如果加的是讀鎖署海,那么只能執(zhí)行查詢操作吗购,而不能執(zhí)行更新操作
  • 寫(xiě)鎖和讀鎖優(yōu)先級(jí)的問(wèn)題是可以通過(guò)參數(shù)調(diào)節(jié)的:max_write_lock_count和low-priority-updates
  • MyISAM可以支持查詢和插入操作的并發(fā)進(jìn)行医男。可以通過(guò)系統(tǒng)變量concurrent_insert來(lái)指定哪種模式捻勉,在MyISAM中它默認(rèn)是:如果MyISAM表中沒(méi)有空洞(即表的中間沒(méi)有被刪除的行)镀梭,MyISAM允許在一個(gè)進(jìn)程讀表的同時(shí),另一個(gè)進(jìn)程從表尾插入記錄踱启。
MyISAM 的鎖調(diào)度

MyISAM 存儲(chǔ)引擎的讀鎖和寫(xiě)鎖是互斥的报账,讀寫(xiě)操作是串行的。那么禽捆,一個(gè)進(jìn)程請(qǐng)求某個(gè) MyISAM 表的讀鎖笙什,同時(shí)另一個(gè)進(jìn)程也請(qǐng)求同一表的寫(xiě)鎖,MySQL 如何處理呢胚想?
寫(xiě)進(jìn)程先獲得鎖琐凭。不僅如此,即使讀請(qǐng)求先到鎖等待隊(duì)列浊服,寫(xiě)請(qǐng)求后到统屈,寫(xiě)鎖也會(huì)插到讀鎖請(qǐng)求之前

Innodb行鎖

InnoDB實(shí)現(xiàn)了以下兩種類(lèi)型的行鎖

  • 共享鎖(S鎖):允許一個(gè)事務(wù)去讀一行,阻止其他事務(wù)獲得相同數(shù)據(jù)集的排他鎖
    (也叫做讀鎖:讀鎖是共享的牙躺,多個(gè)客戶可以同時(shí)讀取同一個(gè)資源愁憔,但不允許其他客戶修改)
  • 排他鎖(X鎖) :允許獲得排他鎖的事務(wù)更新數(shù)據(jù),阻止其他事務(wù)取得相同數(shù)據(jù)集的共享讀鎖和排他寫(xiě)鎖
    (也叫做寫(xiě)鎖:寫(xiě)鎖是排他的孽拷,寫(xiě)鎖會(huì)阻塞其他的寫(xiě)鎖和讀鎖)

另外吨掌,為了允許行鎖和表鎖共存,實(shí)現(xiàn)多粒度鎖機(jī)制脓恕,InnoDB 還有兩種內(nèi)部使用的意向鎖(Intention Locks)膜宋,這兩種意向鎖都是表鎖

  • 意向共享鎖(IS):事務(wù)打算給數(shù)據(jù)行加行共享鎖,事務(wù)在給一個(gè)數(shù)據(jù)行加共享鎖前必須先取得該表的 IS 鎖
  • 意向排他鎖(IX):事務(wù)打算給數(shù)據(jù)行加行排他鎖炼幔,事務(wù)在給一個(gè)數(shù)據(jù)行加排他鎖前必須先取得該表的 IX 鎖


    image.png

意向鎖是 InnoDB 自動(dòng)加的秋茫,不需用戶干預(yù)。對(duì)于 UPDATE乃秀、DELETE 和 INSERT 語(yǔ)句肛著,InnoDB會(huì)自動(dòng)給涉及數(shù)據(jù)集加排他鎖(X);對(duì)于普通 SELECT 語(yǔ)句跺讯,InnoDB 不會(huì)加任何鎖枢贿;事務(wù)可以通過(guò)以下語(yǔ)句顯示給記錄集加共享鎖或排他鎖:

  • 共享鎖(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
  • 排他鎖(X):SELECT * FROM table_name WHERE ... FOR UPDATE

只有通過(guò)索引條件檢索數(shù)據(jù),InnoDB 才使用行級(jí)鎖刀脏,否則萨咕,InnoDB 將使用表鎖

session1 session2
mysql> select * from tab_no_index where id = 1 for update;
mysql> select * from tab_no_index where id = 2 for update;
阻塞等待

這里由于tab_on_index表沒(méi)有加索引,所以即使是為id=1的加鎖火本,也是用到的不是行鎖而是表鎖危队,所以導(dǎo)致session2查詢時(shí)阻塞等待

由于 MySQL 的行鎖是針對(duì)索引加的鎖,不是針對(duì)記錄加的鎖钙畔,所以雖然是訪問(wèn)不同行的記錄茫陆,但是如果是使用相同的索引鍵,是會(huì)出現(xiàn)鎖沖突的擎析。

當(dāng)表有多個(gè)索引的時(shí)候簿盅,不同的事務(wù)可以使用不同的索引鎖定不同的行,另外揍魂,不論是使用主鍵索引桨醋、唯一索引或普通索引,InnoDB 都會(huì)使用行鎖來(lái)對(duì)數(shù)據(jù)加鎖

間隙鎖

當(dāng)我們用范圍條件而不是相等條件檢索數(shù)據(jù)现斋,并請(qǐng)求共享或排他鎖時(shí)喜最,InnoDB 會(huì)給符合條件的已有數(shù)據(jù)記錄的索引項(xiàng)加鎖;對(duì)于鍵值在條件范圍內(nèi)但并不存在的記錄庄蹋,叫做“間隙(GAP)”瞬内,InnoDB 也會(huì)對(duì)這個(gè)“間隙”加鎖,這種鎖機(jī)制就是所謂的間隙鎖(Next-Key 鎖)限书。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虫蝶,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子倦西,更是在濱河造成了極大的恐慌能真,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,002評(píng)論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扰柠,死亡現(xiàn)場(chǎng)離奇詭異粉铐,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)耻矮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門(mén)秦躯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人裆装,你說(shuō)我怎么就攤上這事踱承。” “怎么了哨免?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,787評(píng)論 0 365
  • 文/不壞的土叔 我叫張陵茎活,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我琢唾,道長(zhǎng)载荔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,237評(píng)論 1 300
  • 正文 為了忘掉前任采桃,我火速辦了婚禮懒熙,結(jié)果婚禮上丘损,老公的妹妹穿的比我還像新娘。我一直安慰自己工扎,他們只是感情好徘钥,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,237評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著肢娘,像睡著了一般呈础。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上橱健,一...
    開(kāi)封第一講書(shū)人閱讀 52,821評(píng)論 1 314
  • 那天而钞,我揣著相機(jī)與錄音,去河邊找鬼拘荡。 笑死臼节,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俱病。 我是一名探鬼主播官疲,決...
    沈念sama閱讀 41,236評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼亮隙!你這毒婦竟也來(lái)了途凫?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,196評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤溢吻,失蹤者是張志新(化名)和其女友劉穎维费,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體促王,經(jīng)...
    沈念sama閱讀 46,716評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犀盟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,794評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蝇狼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阅畴。...
    茶點(diǎn)故事閱讀 40,928評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖迅耘,靈堂內(nèi)的尸體忽然破棺而出贱枣,到底是詐尸還是另有隱情,我是刑警寧澤颤专,帶...
    沈念sama閱讀 36,583評(píng)論 5 351
  • 正文 年R本政府宣布纽哥,位于F島的核電站,受9級(jí)特大地震影響栖秕,放射性物質(zhì)發(fā)生泄漏春塌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,264評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望只壳。 院中可真熱鬧俏拱,春花似錦、人聲如沸吕世。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,755評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)命辖。三九已至,卻和暖如春分蓖,著一層夾襖步出監(jiān)牢的瞬間尔艇,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,869評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工么鹤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留终娃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,378評(píng)論 3 379
  • 正文 我出身青樓蒸甜,卻偏偏與公主長(zhǎng)得像棠耕,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柠新,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,937評(píng)論 2 361

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