InnoDB 事務(wù)的實(shí)現(xiàn)原理

InnoDB 事務(wù)的實(shí)現(xiàn)

事務(wù)四大特性ACID

  1. 原子性(A):事務(wù)中的操作要不全部執(zhí)行,要不全部不執(zhí)行寡喝。如果執(zhí)行到一半糙俗,宕機(jī)重啟,已執(zhí)行的一半要回滾回去

  2. 一致性(C):各種約束條件拘荡,比如主鍵不能為空臼节、參照完整性

  3. 隔離性(I):多個事務(wù)并發(fā)訪問時,事務(wù)之間是隔離的珊皿,一個事務(wù)不應(yīng)該影響其他事務(wù)的運(yùn)行效果

  4. 持久性(D):一旦事務(wù)提交了网缝,數(shù)據(jù)不能丟。比如提交了蟋定,但是數(shù)據(jù)沒有刷到磁盤粉臊,宕機(jī)時,要保證將數(shù)據(jù)持久化到磁盤

InnoDB宕機(jī)時也保證數(shù)據(jù)的持久性和原子性驶兜,分為 3 個階段

實(shí)現(xiàn)前提:Checkpoint 機(jī)制

? 基于兩張表:活躍事務(wù)表和臟頁表扼仲,定時將這兩張表進(jìn)行拍快照,存到 redolog 中

  1. 活躍事務(wù)表:存的是所有沒提交的事務(wù)集合抄淑,每條記錄由 事務(wù) ID + lastLSN(該事務(wù)的最后一條日志的 LSN屠凶,用于進(jìn)行回滾操作)

    tx_id lastLSN
  2. 臟頁表:當(dāng)前所有未刷到磁盤上的 Page 集合(包括提交和未提交的事務(wù)),每條記錄由 page_no 和 recoveryLSN(Page 第一次變成臟頁時的 LSN肆资,用于將后面的所有修改都刷磁盤)

    page_no recoveryLSN

1. 分析階段:

  • 找出哪些數(shù)據(jù)頁是臟頁:通過checkpoint 的臟頁表中的臟頁矗愧,遍歷 redoLog,將遇到的新 Page 加到臟頁集合(可能不是臟頁郑原,但是利用刷 page 的冪等性保障結(jié)果一致)
  • 找出哪些事務(wù)沒提交:從 checkpoint 開始唉韭,假如活躍事務(wù)表的未提交事務(wù)的集合為 T1,T2夜涕,遍歷之后的 redoLog,發(fā)現(xiàn)有結(jié)束標(biāo)記的属愤,需要從集合刪除女器,如果是新事務(wù)并且沒有事務(wù)結(jié)束標(biāo)識,就加進(jìn)來住诸,得到最終未提交的事務(wù)

2. 進(jìn)行 Redo

? 從 redolog 中的最后一次 checkpoint 快照驾胆,從臟頁快照中的所有臟頁記錄中得到最小的 recoveryLSN,作為 firstLSN, 遍歷 redoLog只壳,將對于的 Page 全部刷一次磁盤(包括提交和未提交的 Page)俏拱,已提交的Page 重新刷磁盤不會有問題(冪等性:因為 Page 中記錄有個字段pageLSN最后一次修改的LSN,當(dāng)更新時發(fā)現(xiàn)請求的 LSN<=pageLSN,忽略)吼句。

? redo 后,可能會存在需要回滾的Page 數(shù)據(jù)(未提交的數(shù)據(jù))事格,通過 Undo 進(jìn)行恢復(fù)

3. 進(jìn)行 Undo

? 通過分析階段找到未提交的集合惕艳,參考個最后一個日志逆序遍歷,生成逆向的 SQL 語句驹愚,在 redoLog 的尾部進(jìn)行追加远搪。(不存在物理的回滾,全部都是正向的 commit)

總結(jié)

  1. 通過 undo log + redo log + checkpoint(活躍事務(wù)表和臟表)實(shí)現(xiàn)事務(wù)的 原子性(A)+ 持久性(D)
  2. 通過 MVCC+ 鎖實(shí)現(xiàn)了事務(wù)的隔離性(I)和并發(fā)性
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逢捺,一起剝皮案震驚了整個濱河市谁鳍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌劫瞳,老刑警劉巖倘潜,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異志于,居然都是意外死亡涮因,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門伺绽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來养泡,“玉大人,你說我怎么就攤上這事奈应±窖冢” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵杖挣,是天一觀的道長肩榕。 經(jīng)常有香客問我,道長程梦,這世上最難降的妖魔是什么点把? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任橘荠,我火速辦了婚禮,結(jié)果婚禮上郎逃,老公的妹妹穿的比我還像新娘哥童。我一直安慰自己,他們只是感情好褒翰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布贮懈。 她就那樣靜靜地躺著,像睡著了一般优训。 火紅的嫁衣襯著肌膚如雪朵你。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天揣非,我揣著相機(jī)與錄音抡医,去河邊找鬼。 笑死早敬,一個胖子當(dāng)著我的面吹牛忌傻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搞监,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼水孩,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了琐驴?” 一聲冷哼從身側(cè)響起俘种,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绝淡,沒想到半個月后宙刘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡够委,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年荐类,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茁帽。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡玉罐,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出潘拨,到底是詐尸還是另有隱情吊输,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布铁追,位于F島的核電站季蚂,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扭屁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一算谈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧料滥,春花似錦然眼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至践宴,卻和暖如春鲸匿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背阻肩。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工带欢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烤惊。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓洪囤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撕氧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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