MySQL之樂觀鎖·MVCC

mysql

一、 樂觀鎖悲觀鎖

樂觀鎖悲觀鎖 是實現(xiàn)并發(fā)操作的兩種不同的 加鎖思想础拨,其中:

  • 樂觀鎖 假設(shè):操作能成功牌借,不需要事先加鎖,只要在真正提交時驗證 本次修改是否可以提交巩那,如果不可以提交,則重新嘗試更新此蜈。
  • 悲觀鎖 假設(shè):操作不能成功即横,需要事先對要更新的數(shù)據(jù)加鎖,操作成功后再釋放鎖裆赵,以便其他線程能獲得鎖东囚。

二、 MVCC 實現(xiàn)思路

MVVC战授,全名 Multi-Version Concurrency Control页藻,即:多版本并發(fā)控制,是 MySQL 的 InnoDB 存儲引擎下植兰,repeatable-readread-committed 隔離級別時事務(wù)的 樂觀鎖 的實現(xiàn)方案份帐。大概的實現(xiàn)思路是:

  • 在 InnoDB 的表中增加兩個隱藏字段:創(chuàng)建版本號刪除版本號
  • 在開啟一個事務(wù)時楣导,生成一個事務(wù)的版本號废境。
  • 被操作的數(shù)據(jù),會臨時生成一條新的記錄,這條 臨時記錄 對其他事務(wù)時不可見的(事務(wù)的隔離性原則)噩凹。
  • 如果事務(wù)執(zhí)行成功朦促,會將 更新后的數(shù)據(jù)事務(wù)的版本號 更新到真實的記錄上,同時刪除臨時記錄栓始。
  • 因此,在 MVCC 中血当,其實是不存在 的幻赚,既避免了爭鎖等問題,又保證了并發(fā)操作臊旭。

三落恼、 MVCC 下的 CURD

1. insert

將當(dāng)前的事務(wù)版本號作為數(shù)據(jù)的創(chuàng)建版本號。

2. delete

將當(dāng)前的事務(wù)版本號作為數(shù)據(jù)的刪除版本號离熏。

3. update
  • 基于要刪除的行佳谦,復(fù)制出一個臨時行。
  • 將當(dāng)前事務(wù)的版本號設(shè)置為要刪除數(shù)據(jù)的刪除版本號滋戳。
  • 將當(dāng)前事務(wù)的版本號設(shè)置為臨時行的創(chuàng)建版本號钻蔑。
  • 事務(wù)提交時,用臨時行替換要刪除的行奸鸯。
4. select

同時滿足一下兩個條件的數(shù)據(jù)咪笑,會作為查詢結(jié)果返回:

  • 條件一:數(shù)據(jù)的創(chuàng)建版本號小于等于事務(wù)版本號。即:在事務(wù)開始前娄涩,數(shù)據(jù)是存在的窗怒。
  • 條件二:數(shù)據(jù)的刪除版本號未定義或者大于事務(wù)版本號。即:在事務(wù)開始前蓄拣,數(shù)據(jù)還沒被刪除扬虚。

四、MVCC 優(yōu)缺點

1. 優(yōu)點:
  • 因為 MVCC 中并沒有使用鎖球恤,從而避免了 的資源浪費和 爭鎖辜昵、死鎖 等問題。
  • 使用兩個隱藏的版本號和事務(wù)版本號巧妙的解決了 不可重復(fù)讀 的問題碎捺。
  • 不加鎖路鹰,速度快。
  • 不沖突收厨。
2. 缺點:
  • 存儲了更多數(shù)據(jù)(兩個隱藏的版本號字段)
  • 增加了很多檢查工作和處理完后的善后工作晋柱。
  • 只能在 repeatable-readread-committed 隔離級別下工作。
  • read-uncommitted 隔離級別下 MVCC 每次都獲取到最新的事務(wù)版本號诵叁。
  • serializable 隔離級別時雁竞,讀操作鎖定了返回的每一行。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碑诉,隨后出現(xiàn)的幾起案子彪腔,更是在濱河造成了極大的恐慌,老刑警劉巖进栽,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件德挣,死亡現(xiàn)場離奇詭異,居然都是意外死亡快毛,警方通過查閱死者的電腦和手機格嗅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唠帝,“玉大人屯掖,你說我怎么就攤上這事〗笏ィ” “怎么了贴铜?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瀑晒。 經(jīng)常有香客問我绍坝,道長,這世上最難降的妖魔是什么苔悦? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任陷嘴,我火速辦了婚禮,結(jié)果婚禮上间坐,老公的妹妹穿的比我還像新娘灾挨。我一直安慰自己,他們只是感情好竹宋,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布劳澄。 她就那樣靜靜地躺著,像睡著了一般蜈七。 火紅的嫁衣襯著肌膚如雪秒拔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天飒硅,我揣著相機與錄音砂缩,去河邊找鬼。 笑死三娩,一個胖子當(dāng)著我的面吹牛庵芭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雀监,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼双吆,長吁一口氣:“原來是場噩夢啊……” “哼眨唬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起好乐,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤匾竿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蔚万,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岭妖,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年反璃,在試婚紗的時候發(fā)現(xiàn)自己被綠了区转。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡版扩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出侄泽,到底是詐尸還是另有隱情礁芦,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布悼尾,位于F島的核電站柿扣,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏闺魏。R本人自食惡果不足惜未状,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望析桥。 院中可真熱鬧司草,春花似錦、人聲如沸泡仗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩怎。三九已至搔课,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間截亦,已是汗流浹背爬泥。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崩瓤,地道東北人袍啡。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像却桶,于是被迫代替她去往敵國和親葬馋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355