MySQL【05】鎖機(jī)制:共享鎖杠巡、排他鎖、意向鎖

本文將以實(shí)驗(yàn)為主雇寇,演示共享鎖氢拥、排他鎖的特性,演示行鎖升級(jí)為表鎖锨侯。
為進(jìn)行實(shí)驗(yàn)嫩海,先建立account表,含有一個(gè)主鍵id

CREATE TABLE account (
    id INT (11) NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) DEFAULT NULL,
    balance INT DEFAULT 0,
    PRIMARY KEY (id)
) ENGINE = INNODB DEFAULT CHARSET = utf8;

INSERT INTO account (name, balance) VALUES ('li', 10);
INSERT INTO account (name, balance) VALUES ('ha', 233);
account表

1囚痴、共享鎖叁怪、也叫讀鎖、S鎖

讀鎖是共享的深滚,或者說(shuō)是互相不阻塞的奕谭,多個(gè)客戶在同一時(shí)刻可以同時(shí)讀取同一資源,而互不干擾成箫。
若 事務(wù)T 對(duì)數(shù)據(jù) 對(duì)象A 加上 S鎖 展箱,其他事務(wù)可以對(duì) A 加 S鎖 ,但不能加 X鎖 蹬昌,直到 T 釋放 A 上的 S鎖混驰。
S鎖保證了其他事務(wù)可以讀A,但在T釋放A上的S鎖之前不能對(duì)A做任何修改。
加讀鎖:普通的select語(yǔ)句不會(huì)加任何鎖栖榨,加讀鎖需要顯示的加上【LOCK IN SHARE MODE】昆汹。
下面通過(guò)例子展示讀鎖的特點(diǎn)。

步驟 會(huì)話 A命令 balance值 會(huì)話 B命令 balance值
1 BEGIN;
2 select balance from account where id = 1 LOCK IN SHARE MODE; 10
3 select balance from account where id = 1 LOCK IN SHARE MODE; 10
4 update account set balance = 666 where id = 1; 將會(huì)被阻塞
5 COMMIT; update執(zhí)行

可以發(fā)現(xiàn)會(huì)話A 對(duì)id=1行加讀鎖之后婴栽,會(huì)話B任然可以對(duì)id=1行加讀鎖满粗,但是會(huì)話B繼續(xù)對(duì)id=1行執(zhí)行更新操作將會(huì)被阻塞。
如果在第5步不是提交事務(wù)愚争,而是執(zhí)行一個(gè)更新語(yǔ)句的話映皆,update account set balance = 777 where id = 1,這時(shí)候?qū)?huì)發(fā)生死鎖現(xiàn)象轰枝。

2捅彻、排他鎖、也叫寫鎖鞍陨、X鎖

寫鎖是排他的步淹,也就是說(shuō)一個(gè)寫鎖會(huì)阻塞其他的寫鎖和讀鎖,這是出于安全策略的考慮诚撵。
事務(wù)T對(duì)數(shù)據(jù)對(duì)象A加上X鎖缭裆,事務(wù)T可以讀A也可以修改A,其他事務(wù)不能再對(duì)A加任何鎖寿烟,直到T釋放A上的鎖澈驼。
X鎖保證了其他事務(wù)在T釋放A上的鎖之前不能再讀取和修改A。

1韧衣、自動(dòng)加鎖: delete / update / insert 語(yǔ)句會(huì)自動(dòng)加上排他鎖盅藻;
2、手動(dòng)加排它鎖:select * from student where id=1 FOR UPDATE畅铭;

步驟 會(huì)話 A命令 balance值 會(huì)話 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where id = 1;
3 select balance from account where id = 1; 10
4 select balance from accountwhere id = 2 LOCK IN SHARE MODE; 不阻塞233
4 select balance from account where id = 1 LOCK IN SHARE MODE; 阻塞
5 COMMIT; 結(jié)果出來(lái)0

可以發(fā)現(xiàn)氏淑, update 語(yǔ)句中 where 條件為主鍵時(shí),是對(duì)該行上鎖硕噩,其他會(huì)話想獲取該行的讀或?qū)戞i都將被阻塞假残,但是其他行不受影響。

3炉擅、為什么推薦 MySQL 的 update 語(yǔ)句中 where 條件要有主鍵索引辉懒、唯一索引?

接下來(lái)演示一下如果update 語(yǔ)句中 where 條件是沒(méi)有索引的name字段會(huì)怎么樣呢谍失。
將會(huì)發(fā)現(xiàn)眶俩,由于name字段沒(méi)有索引,所以對(duì)該行的行鎖升級(jí)為了表鎖快鱼,其他行想獲取讀鎖或?qū)戞i都將被阻塞颠印。

步驟 會(huì)話 A命令 balance值 會(huì)話 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where name = 'li';
3 select balance from account where id = 1; 10
4 select balance from account where id = 2 LOCK IN SHARE MODE; 阻塞
5 Ctrl-c
6 select balance from account where id = 1 LOCK IN SHARE MODE; 阻塞

現(xiàn)在對(duì)name 字段新增唯一索引 https://www.cnblogs.com/ShareJia/p/10008110.html

增加唯一索引:CREATE UNIQUE INDEX index_name ON account (NAME);
刪除指定索引:DROP INDEX NAME ON account;
查詢索引:SHOW INDEX FROM account;
步驟 會(huì)話 A命令 balance值 會(huì)話 B命令 balance值
1 BEGIN;
2 update account set balance = 0 where name = 'li';
3 select balance from account where id = 1; 10
4 select balance from account where id = 2 LOCK IN SHARE MODE; 10
6 select balance from accountwhere id = 1 LOCK IN SHARE MODE; 阻塞

會(huì)發(fā)現(xiàn)纲岭,對(duì)name 字段添加索引后,僅name為'li'的這一行上了鎖线罕。

原理簡(jiǎn)析:

推薦閱讀:
MySQL InnoDB鎖原理剖析
如何書寫 update 避免表鎖
InnoDB行鎖是通過(guò)給索引上的索引項(xiàng)加鎖來(lái)實(shí)現(xiàn)的止潮。所以,只有通過(guò)索引條件檢索數(shù)據(jù)钞楼,InnoDB才使用行級(jí)鎖喇闸,否則,InnoDB將使用表鎖询件。

4燃乍、意向鎖

Inno存儲(chǔ)引擎支持意向共享鎖,意向鎖為表級(jí)別的鎖雳殊。設(shè)計(jì)的主要目的是為了在一個(gè)事務(wù)中揭示下一行將被請(qǐng)求的鎖類型橘沥。其支持兩種意向鎖窗轩。
1夯秃、意向共享鎖 IS
2、意向排他鎖 IX
意向鎖可以優(yōu)化鎖之間的性能痢艺。

B站學(xué)習(xí)視頻
相關(guān)問(wèn)題:
為什么表沒(méi)有索引仓洼,表里所有的記錄都會(huì)被鎖住
update age from user無(wú)索引是行鎖還是表鎖,為什么

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末堤舒,一起剝皮案震驚了整個(gè)濱河市色建,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舌缤,老刑警劉巖箕戳,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異国撵,居然都是意外死亡陵吸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門介牙,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)壮虫,“玉大人,你說(shuō)我怎么就攤上這事环础∏羲疲” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵线得,是天一觀的道長(zhǎng)饶唤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贯钩,這世上最難降的妖魔是什么募狂? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任呵晨,我火速辦了婚禮,結(jié)果婚禮上熬尺,老公的妹妹穿的比我還像新娘摸屠。我一直安慰自己,他們只是感情好粱哼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布季二。 她就那樣靜靜地躺著,像睡著了一般揭措。 火紅的嫁衣襯著肌膚如雪胯舷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天绊含,我揣著相機(jī)與錄音桑嘶,去河邊找鬼。 笑死躬充,一個(gè)胖子當(dāng)著我的面吹牛逃顶,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播充甚,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼以政,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伴找?” 一聲冷哼從身側(cè)響起盈蛮,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎技矮,沒(méi)想到半個(gè)月后抖誉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衰倦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年袒炉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耿币。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梳杏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出淹接,到底是詐尸還是另有隱情十性,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布塑悼,位于F島的核電站劲适,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏厢蒜。R本人自食惡果不足惜霞势,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一烹植、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧愕贡,春花似錦草雕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至憨琳,卻和暖如春诫钓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篙螟。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工菌湃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遍略。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓惧所,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親墅冷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纯路,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355