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

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

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


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


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

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


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

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


結(jié)論純粹是個人推測出來的,憑個人的實驗驗證和進一步的猜想得來,但不一定就是正確的!!!

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

事務1和事務2是基于相同的背景的,關閉了自動提交,設置隔離級別為提交讀,然后開始了事務。

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

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

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

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

至于讀時加鎖或者借助mvcc機制的情況,等我進一步學習mvcc后再來補充。

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



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

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

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

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

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

隱藏的ID

假設我們有記錄如下


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

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


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

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

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

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

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

1、trx_id<min_id,說明在開啟事務前,記錄已存在,可見。

2、trx_id>max_id,說明在開啟事務時,記錄還不存在,不可見。

3、min_id<trx_id<max_id,這時候我們需要遍歷read view表,看看是否有對應的事務版本號。如果有,說明在開啟事務時,記錄處于活躍狀態(tài),此時需要對照回滾id,找到undo表中相應的記錄。如果沒有,說明開啟事務時,修改了該條記錄的另一個事務已經(jīng)結(jié)束,記錄可見。



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

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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,443評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,530評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,407評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,981評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,759評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,204評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,263評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,415評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,955評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,650評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,892評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,675評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,967評論 2 374

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