mysql隔離級別實現(xiàn)原理探究

mysql隔離級別實現(xiàn)原理探究

關(guān)于這個話題,在網(wǎng)上看到了多種說法谷炸,總是擼不通思路北专,于是決定自己探究,先把結(jié)論貼出來


未提交讀寫時加排他鎖旬陡,寫完釋放拓颓;(讀時不加鎖;)


提交讀寫時加排他鎖描孟,事務(wù)結(jié)束后釋放

讀時通過mvcc驶睦,訪問的是創(chuàng)建版本最大&&刪除版本為空的記錄


重復(fù)讀寫時加排他鎖,事務(wù)結(jié)束后釋放

讀時通過mvcc画拾,訪問的是創(chuàng)建版本小于等于當(dāng)前版本&&(刪除版本大于當(dāng)前版本 ||?刪除版本為空)的記錄


結(jié)論純粹是個人推測出來的,憑個人的實驗驗證和進(jìn)一步的猜想得來菜职,但不一定就是正確的G嗯住!酬核!

簡單驗證一下提交讀情況下蜜另,寫時加排他鎖,事務(wù)結(jié)束后釋放的情況:

事務(wù)1和事務(wù)2是基于相同的背景的嫡意,關(guān)閉了自動提交举瑰,設(shè)置隔離級別為提交讀,然后開始了事務(wù)蔬螟。

接下來我們可以看到此迅,事務(wù)2對id為1的記錄做了修改,這個時候并沒有提交旧巾,此時事務(wù)1也嘗試對該記錄做修改耸序,但卻失敗了,報錯說鎖等待超時鲁猩。

之后我將事務(wù)2提交了坎怪,事務(wù)1再次執(zhí)行修改語句,成功了廓握。

從上面的實驗可以得出一個結(jié)論搅窿,隔離級別為提交讀的情況下嘁酿,對記錄的修改會加上排他鎖,且直到事務(wù)結(jié)束時才釋放男应。

其他隔離級別下的寫時加鎖情況可以依據(jù)上面的實驗去推出結(jié)論闹司,請有興趣的讀者自行驗證。

至于讀時加鎖或者借助mvcc機制的情況殉了,等我進(jìn)一步學(xué)習(xí)mvcc后再來補充开仰。

https://blog.csdn.net/aigoogle/article/details/42558075谷歌搜到這篇博文與本文的思想是一樣的。



繼續(xù)探究了mysql的mvcc實現(xiàn)后薪铜,有了一些新的理解:

在mysql內(nèi)部維護(hù)著很多的日志表众弓,其中有一個叫做undo日志表(記錄原始數(shù)據(jù),主要用于事務(wù)回滾操作隔箍,也可以用于mvcc機制)谓娃,同時還使用了一個叫做read view的表來做可見性判斷。

在mysql中蜒滩,mvcc是通過在表中插入三個隱藏字段實現(xiàn)的滨达,這三個隱藏字段如下:

6字節(jié)的事務(wù)ID? DB_TRX_ID)?

7字節(jié)的回滾指針(DB_ROLL_PTR)?

隱藏的ID

假設(shè)我們有記錄如下


圖片來源于第一篇參考文章

現(xiàn)在我們開啟一個事務(wù)1,并對該記錄做修改


圖片來源于第一篇參考文章

這個時候如果有另外一個事務(wù)2俯艰,并且這個事務(wù)2的版本小于事務(wù)1捡遍,現(xiàn)在,事務(wù)1要查詢這條記錄竹握。

在真實表中画株,數(shù)據(jù)已被修改,但因為事務(wù)2的版本小于事務(wù)1的版本啦辐,這條修改對事務(wù)2來說是不可見的谓传,于是就根據(jù)這條記錄的回滾id找到了undo log中原來的數(shù)據(jù)。

在真實情況中芹关,并發(fā)的事務(wù)數(shù)量大续挟,對數(shù)據(jù)的可見性需要統(tǒng)一管理,于是就有了read view侥衬。

在可重復(fù)讀級別下诗祸,開啟一個事務(wù),這個時候mysql就要將此刻所有活躍的事務(wù)拷貝到一個新的read view表中轴总, 假定其中最大最小的事務(wù)版本號分別為max_id,min_id贬媒,現(xiàn)要查詢的記錄版本號為trx_id。有以下幾種情況:

1肘习、trx_id<min_id际乘,說明在開啟事務(wù)前,記錄已存在漂佩,可見脖含。

2罪塔、trx_id>max_id,說明在開啟事務(wù)時养葵,記錄還不存在征堪,不可見。

3关拒、min_id<trx_id<max_id佃蚜,這時候我們需要遍歷read view表,看看是否有對應(yīng)的事務(wù)版本號着绊。如果有谐算,說明在開啟事務(wù)時,記錄處于活躍狀態(tài)归露,此時需要對照回滾id洲脂,找到undo表中相應(yīng)的記錄。如果沒有剧包,說明開啟事務(wù)時恐锦,修改了該條記錄的另一個事務(wù)已經(jīng)結(jié)束,記錄可見疆液。



在提交讀的級別下一铅,不同的地方在于每次執(zhí)行語句時,都會重新計算一個新的read view表堕油,這樣就可以達(dá)到讀取已提交記錄的目的潘飘。

參考文章:http://www.imooc.com/article/17290

https://liuzhengyang.github.io/2017/04/18/innodb-mvcc/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市馍迄,隨后出現(xiàn)的幾起案子福也,更是在濱河造成了極大的恐慌局骤,老刑警劉巖攀圈,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異峦甩,居然都是意外死亡赘来,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進(jìn)店門凯傲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犬辰,“玉大人,你說我怎么就攤上這事冰单』戏欤” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵诫欠,是天一觀的道長涵卵。 經(jīng)常有香客問我浴栽,道長,這世上最難降的妖魔是什么轿偎? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任典鸡,我火速辦了婚禮,結(jié)果婚禮上坏晦,老公的妹妹穿的比我還像新娘萝玷。我一直安慰自己,他們只是感情好昆婿,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布球碉。 她就那樣靜靜地躺著,像睡著了一般挖诸。 火紅的嫁衣襯著肌膚如雪汁尺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天多律,我揣著相機與錄音痴突,去河邊找鬼。 笑死狼荞,一個胖子當(dāng)著我的面吹牛辽装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播相味,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼拾积,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丰涉?” 一聲冷哼從身側(cè)響起拓巧,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎一死,沒想到半個月后肛度,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡投慈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年承耿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伪煤。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡加袋,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抱既,到底是詐尸還是另有隱情职烧,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站蚀之,受9級特大地震影響跋理,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恬总,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一前普、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧壹堰,春花似錦拭卿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至谆焊,卻和暖如春惠桃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背辖试。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工辜王, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绝页,地道東北人诅岩。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓禾乘,卻偏偏與公主長得像冗荸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冬竟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

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