MySQL - 排它鎖 for update 及 共享鎖 select ... lock in share mode

排它鎖(寫(xiě)鎖) For Update


作用

使用for update 為所有查詢select的記錄加上獨(dú)占鎖蹬蚁。

獨(dú)占鎖又叫寫(xiě)鎖,意思在鎖的期間辞嗡,不允許其他任何嘗試獲取鎖(包括讀鎖和寫(xiě)鎖)的請(qǐng)求,只有這個(gè)鎖被釋放掉才能被另外一個(gè)事務(wù)獲取鎖匈子。

示例

事務(wù) T1 先執(zhí)行如下語(yǔ)句

begin;
select * from trans where id=2 for update; -- 這里對(duì)id=2的記錄進(jìn)行加鎖(排它鎖)
-- 注意這里還沒(méi)有結(jié)束事務(wù),會(huì)一直占用著id=2記錄的鎖

事務(wù) T2 在以上語(yǔ)句執(zhí)行后 執(zhí)行如下語(yǔ)句:

begin;   -- 即使沒(méi)有開(kāi)始事務(wù),下面的語(yǔ)句也會(huì)被一直阻塞
select * from trans; -- 這里只是簡(jiǎn)單請(qǐng)求查詢,并沒(méi)有請(qǐng)求獲取鎖代乃,所以這里不會(huì)被阻塞旬牲,不需要等待事務(wù)T1結(jié)束事務(wù)



select * from trans for update; -- 這里查詢包含id=2的記錄,嘗試獲取排它鎖搁吓,但由于事務(wù)T1還沒(méi)有結(jié)束事務(wù)原茅,一直占用著id=2的行鎖,所以這里會(huì)一直等待獲取鎖

update trans set xxx=xxx where id=2; -- update語(yǔ)句也會(huì)嘗試申請(qǐng)寫(xiě)鎖堕仔,所以這里也一樣被阻塞擂橘,等待事務(wù)T1的鎖

commit; 

應(yīng)用場(chǎng)景

使用for update 可以解決臟讀問(wèn)題,例如:
有兩個(gè)定時(shí)任務(wù)(可以當(dāng)作兩個(gè)事務(wù))分別為Job-1 和 Job-2, 這兩個(gè)Job都會(huì)修改同一條記錄,可能出現(xiàn)其中一個(gè)Job 讀取這條記錄摩骨,是另外一個(gè)Job準(zhǔn)備要修改的通贞,等另外一個(gè)Job修改完朗若,這個(gè)Job讀取的這條記錄已經(jīng)過(guò)時(shí),如下執(zhí)行順序(就當(dāng)下面是44拍樂(lè)譜里的一小節(jié)):


          ①                              ④
Job-1: | ======= | ======= | ======= | ======= |



                    ②         ③
Job-2: | ======= | ======= | ======= | ======= |

注解:
順序① : 執(zhí)行查詢語(yǔ)句昌罩,準(zhǔn)備下一步更新

 -- Job-1語(yǔ)句
begin;
select total from xxx where id=2; -- 這里查詢id=2記錄的total,得出total值為3

順序②: Job-2 更新Job-1 在順序-1中查詢的記錄

 -- Job-2語(yǔ)句
begin;
update xxx set total=10 where id=2; -- 這里修改id=2記錄的total值為10

順序③: Job-2 結(jié)束事務(wù)

 -- Job-2語(yǔ)句
commit;

順序④: 使用過(guò)期數(shù)據(jù)total進(jìn)行累加遞增

 -- Job-1語(yǔ)句
update xxx set total=3+10 where id=2; -- 由于這里的3已經(jīng)過(guò)時(shí)了哭懈,導(dǎo)致total與實(shí)際的10相差了7,實(shí)際累計(jì)之后應(yīng)該是 10 + 10 = 20
commit;

解決

為了解決Job-1讀取的id=2記錄的total值不過(guò)時(shí),所以在順序①查詢id=2時(shí)通過(guò)for update 進(jìn)行加鎖即可:

-- Job-1語(yǔ)句
select * from trans where id=2 for update;

或者使用共享鎖:

select * from trans where id=2 lock in share mode;

關(guān)于共享鎖請(qǐng)往下看茎用。

.
.
.
.
.
.
.
.

共享鎖(讀鎖) Select ... lock in share mode


作用

對(duì)select 查詢的所有記錄加上共享鎖(或者說(shuō)獲取這些記錄的共享鎖)
允許其他事務(wù)也加上共享鎖
但不允許其他事務(wù)加上寫(xiě)鎖

共享鎖的特征

  1. 別名
    共享鎖又讀鎖

  2. 何謂"共享"?
    所謂共享的意思是如果事務(wù) A 獲取了共享鎖, 允許事務(wù)B 也獲取共享鎖遣总,即允許事務(wù)B 可以讀取相同的數(shù)據(jù),就是這樣, 對(duì)另外一個(gè)獲取“共享鎖”的事務(wù)共享當(dāng)前正在讀的數(shù)據(jù)轨功。

    但對(duì)寫(xiě)鎖卻是“排它”的旭斥,意思在獲取的讀鎖的時(shí)候不允許寫(xiě)鎖進(jìn)行寫(xiě)數(shù)據(jù),要不然就會(huì)出現(xiàn)臟讀(讀到的數(shù)據(jù)因?yàn)楸桓亩^(guò)時(shí))古涧。

  3. 實(shí)現(xiàn)原理:
    有一個(gè)先進(jìn)先出的隊(duì)列,隊(duì)列中存放的都是所有鎖垂券,包括共享鎖 和 排它鎖。如下FIFO隊(duì)列示意圖, 按照從左到右的先進(jìn)先出順序存放各種鎖:

列頭 < ①Read Lock == ②Read Lock < ③Write Lock < ④Read Lock < 列尾

注意:上圖隊(duì)列中 讀鎖① 和 讀鎖② 中間用等號(hào)羡滑,表示這兩個(gè)鎖可以同時(shí)進(jìn)行數(shù)據(jù)查詢菇爪。其余的小于符號(hào)表示 右邊的鎖等待小于符號(hào)左邊的鎖。

上圖隊(duì)列中一共有4個(gè)鎖啄栓,分別為讀鎖①娄帖、讀鎖②也祠、寫(xiě)鎖③昙楚、讀鎖④。并且每個(gè)鎖都分別對(duì)用有1個(gè)事務(wù)進(jìn)行獲取诈嘿,即有4個(gè)事務(wù)堪旧。

事務(wù)1(讀鎖)
select * from trans where id=2 lock in share mode;
事務(wù)2(讀鎖)
select * from trans where id=2 lock in share mode;
事務(wù)3(寫(xiě)鎖)
update trans set xxx=10 where id=2; -- 加上寫(xiě)鎖(獨(dú)占鎖)
或
select * from trans where id=2 for update; -- 加上獨(dú)占鎖。
事務(wù)4(讀鎖)
select * from trans where id=2 lock in share mode;

請(qǐng)求鎖順序:

  1. 事務(wù)獲得①讀鎖奖亚。
  2. 事務(wù)2嘗試獲取讀鎖②淳梦,發(fā)現(xiàn)前面已經(jīng)有①鎖并且是一個(gè)讀鎖,這時(shí)候獲取成功,并可以讀取到共享鎖正在讀取的數(shù)據(jù)昔字。
  3. 事務(wù)3嘗試用獲取寫(xiě)鎖③爆袍,但發(fā)現(xiàn)前面已經(jīng)有兩個(gè)寫(xiě)鎖,所以等待直至讀鎖釋放掉作郭。
  4. 事務(wù)4常使用獲取 讀鎖④陨囊,發(fā)現(xiàn)前面的是寫(xiě)鎖③,所以等待事務(wù)3釋放寫(xiě)鎖③,而寫(xiě)鎖③正在等待前面兩個(gè) 讀鎖①夹攒、讀鎖②蜘醋,所以事務(wù)4間接在等待 最前面兩個(gè)讀鎖。

參考


可以參考 Zookeeper 中的共享鎖及獨(dú)占鎖咏尝,原理基本上跟上面說(shuō)的一樣压语。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末啸罢,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胎食,更是在濱河造成了極大的恐慌扰才,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厕怜,死亡現(xiàn)場(chǎng)離奇詭異训桶,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酣倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)舵揭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人躁锡,你說(shuō)我怎么就攤上這事午绳。” “怎么了映之?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵拦焚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我杠输,道長(zhǎng)赎败,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任蠢甲,我火速辦了婚禮僵刮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鹦牛。我一直安慰自己搞糕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布曼追。 她就那樣靜靜地躺著窍仰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪礼殊。 梳的紋絲不亂的頭發(fā)上驹吮,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音晶伦,去河邊找鬼碟狞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛坝辫,可吹牛的內(nèi)容都是我干的篷就。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼竭业!你這毒婦竟也來(lái)了智润?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤未辆,失蹤者是張志新(化名)和其女友劉穎窟绷,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體咐柜,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡兼蜈,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拙友。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片为狸。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖遗契,靈堂內(nèi)的尸體忽然破棺而出辐棒,到底是詐尸還是另有隱情,我是刑警寧澤牍蜂,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布漾根,位于F島的核電站,受9級(jí)特大地震影響鲫竞,放射性物質(zhì)發(fā)生泄漏辐怕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一从绘、第九天 我趴在偏房一處隱蔽的房頂上張望寄疏。 院中可真熱鬧,春花似錦顶考、人聲如沸赁还。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蹈胡,卻和暖如春渊季,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背罚渐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工却汉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荷并。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓合砂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親源织。 傳聞我的和親對(duì)象是個(gè)殘疾皇子翩伪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

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

  • 當(dāng)一個(gè)系統(tǒng)訪問(wèn)量上來(lái)的時(shí)候微猖,不只是數(shù)據(jù)庫(kù)性能瓶頸問(wèn)題了,數(shù)據(jù)庫(kù)數(shù)據(jù)安全也會(huì)浮現(xiàn)缘屹,這時(shí)候合理使用數(shù)據(jù)庫(kù)鎖機(jī)制就顯得異...
    初來(lái)的雨天閱讀 3,564評(píng)論 0 22
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書(shū)筆記凛剥,整理的知識(shí)點(diǎn),也是為了防止忘記轻姿,尊重勞動(dòng)成果犁珠,轉(zhuǎn)載注明出處哦!如果你也喜歡互亮,那...
    波波波先森閱讀 11,247評(píng)論 4 56
  • 當(dāng)一個(gè)系統(tǒng)訪問(wèn)量上來(lái)的時(shí)候,不只是數(shù)據(jù)庫(kù)性能瓶頸問(wèn)題了慕爬,數(shù)據(jù)庫(kù)數(shù)據(jù)安全也會(huì)浮現(xiàn)窑眯,這時(shí)候合理使用數(shù)據(jù)庫(kù)鎖機(jī)制就顯得異...
    JackFrost_fuzhu閱讀 7,726評(píng)論 4 83
  • 還是當(dāng)年的老樣子 王喜民是河北電臺(tái)原副臺(tái)長(zhǎng)、高級(jí)記者医窿,全國(guó)優(yōu)秀記者磅甩。退休后多次到國(guó)外采訪,寫(xiě)了15部專著姥卢。 王喜民...
    邯鄲趙金海閱讀 451評(píng)論 0 0
  • 近來(lái)独榴,工作中遇到一些問(wèn)題僧叉,總是傾向于向同事請(qǐng)教。仔細(xì)想來(lái)棺榔,這些問(wèn)題或許可以通過(guò)自己的摸索和研究瓶堕,就能獨(dú)自解決。然而...
    曾彧閱讀 1,191評(píng)論 2 1