国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

MySQL 為什么需要兩階段提交?

數據庫 MySQL
我們中文一般稱作歸檔日志,如果大家看過松哥之前發的 MySQL 主從搭建,應該對這個日志有印象,當我們搭建 MySQL 主從的時候就離不開 binlog。

為什么要兩階段提交?一階段提交不行嗎?

小伙伴們知道,MySQL 中的事務是兩階段提交,我們見到的很多分布式事務也都是兩階段提交的,例如 Seata,那么為什么要兩階段提交呢?一次直接提交了不行嗎?今天我們來聊聊這個話題。

1. 什么是兩階段提交

1.1 binlog 與 redologbinlog

binlog

我們中文一般稱作歸檔日志,如果大家看過松哥之前發的 MySQL 主從搭建,應該對這個日志有印象,當我們搭建 MySQL 主從的時候就離不開 binlog。

binlog 是 MySQL Server 層的日志,而不是存儲引擎自帶的日志,它記錄了所有的 DDL 和 DML(不包含數據查詢語句)語句,而且是以事件形式記錄,還包含語句所執行的消耗的時間等,需要注意的是:

  • binlog 是一種邏輯日志,他里邊所記錄的是一條 SQL 語句的原始邏輯,例如給某一個字段 +1,注意這個區別于 redo log 的物理日志(在某個數據頁上做了什么修改)。
  • binlog 文件寫滿后,會自動切換到下一個日志文件繼續寫,而不會覆蓋以前的日志,這個也區別于 redo log,redo log 是循環寫入的,即后面寫入的可能會覆蓋前面寫入的。
  • 一般來說,我們在配置 binlog 的時候,可以指定 binlog 文件的有效期,這樣在到期后,日志文件會自動刪除,這樣避免占用較多存儲空間。

根據 MySQL 官方文檔的介紹,開啟 binlog 之后,大概會有 1% 的性能損耗,不過這還是可以接受的,一般來說,binlog 有兩個重要的使用場景:

  • MySQL 主從復制時:在主機上開啟 binlog,主機將 binlog 同步給從機,從機通過 binlog 來同步數據,進而實現主機和從機的數據同步。
  • MySQL 數據恢復,通過使用 mysqlbinlog 工具再結合 binlog 文件,可以將數據恢復到過去的某一時刻。

redo log

前面我們說的 binlog 是 MySQL 自己提供的,在 MySQL 的 server 層,而 redo log 則不是 MySQL 提供的,是存儲引擎 InnoDB 自己提供的。所以在 MySQL 中就存在兩類日志 binlog 和 redo log,存在兩類日志既有歷史原因(InnoDB 最早不是 MySQL 官方存儲引擎)也有技術原因,這個咱們以后再細聊。

我們都知道,事務的四大特性里面有一個是持久性,即只要事務提交成功,那么對數據庫做的修改就被永久保存下來了,寫到磁盤中了,怎么做到的呢?其實我們很容易想到是在每次事務提交的時候,將該事務涉及修改的數據頁全部刷新到磁盤中,一旦寫到磁盤中,就不怕數據丟失了。

但是要是每次都這么搞,數據庫就不知道慢到哪里去了!因為 Innodb 是以頁為單位進行磁盤交互的,而一個事務很可能只修改一個數據頁里面的幾個字節,這個時候將完整的數據頁刷到磁盤的話,不僅效率低,也浪費資源。效率低是因為這些數據頁在物理上并不連續,將數據頁刷到磁盤會涉及到隨機 IO。

有鑒于此,MySQL 設計了 redo log,在 redo log 中只記錄事務對數據頁做了哪些修改。那有人說,寫 redo log 不就是磁盤 IO 嗎?而寫數據到磁盤也是磁盤 IO,既然都是磁盤 IO,那干嘛不把直接把數據寫到磁盤呢?還費這事!

此言差矣。

寫 redo log 跟寫數據有一個很大的差異,那就是 redo log 是順序 IO,而寫數據涉及到隨機 IO,寫數據需要尋址,找到對應的位置,然后更新/添加/刪除,而寫 redo log 則是在一個固定的位置循環寫入,是順序 IO,所以速度要高于寫數據。

redo log 本身又分為:

  • 日志緩沖(redo log buffer),該部分日志是易失性的。
  • 重做日志(redo log file),這是磁盤上的日志文件,該部分日志是持久的。

MySQL 每執行一條 DML 語句,先將記錄寫入 redo log buffer,后續在某個時間點再一次性將多個操作記錄寫到 redo log file,這種先寫日志再寫磁盤的技術就是 MySQL 里經常說到的 WAL(Write-Ahead Logging) 技術(預寫日志)。

1.2 兩階段提交

在 MySQL 中,兩階段提交的主角就是 binlog 和 redolog,我們來看一個兩階段提交的流程圖:

從上圖中可以看出,在最后提交事務的時候,有 3 個步驟:

  • 寫入 redo log,處于 prepare 狀態。
  • 寫 binlog。
  • 修改 redo log 狀態變為 commit。

由于 redo log 的提交分為 prepare 和 commit 兩個階段,所以稱之為兩階段提交。

2. 為什么需要兩階段提交

如果沒有兩階段提交,那么 binlog 和 redolog 的提交,無非就是兩種形式:

  • 先寫 binlog 再寫 redolog。
  • 先寫 redolog 再寫 binlog。

這兩種情況我們分別來看。

假設我們要向表中插入一條記錄 R,如果是先寫 binlog 再寫 redolog,那么假設 binlog 寫完后崩潰了,此時 redolog 還沒寫。那么重啟恢復的時候就會出問題:binlog 中已經有 R 的記錄了,當從機從主機同步數據的時候或者我們使用 binlog 恢復數據的時候,就會同步到 R 這條記錄;但是 redolog 中沒有關于 R 的記錄,所以崩潰恢復之后,插入 R 記錄的這個事務是無效的,即數據庫中沒有該行記錄,這就造成了數據不一致。

相反,假設我們要向表中插入一條記錄 R,如果是先寫 redolog 再寫 binlog,那么假設 redolog 寫完后崩潰了,此時 binlog 還沒寫。那么重啟恢復的時候也會出問題:redolog 中已經有 R 的記錄了,所以崩潰恢復之后,插入 R 記錄的這個事務是有效的,通過該記錄將數據恢復到數據庫中;但是 binlog 中還沒有關于 R 的記錄,所以當從機從主機同步數據的時候或者我們使用 binlog 恢復數據的時候,就不會同步到 R 這條記錄,這就造成了數據不一致。

那么按照前面說的兩階段提交就能解決問題嗎?

我們來看如下三種情況:

情況一:一階段提交之后崩潰了,即寫入 redo log,處于 prepare 狀態 的時候崩潰了,此時:

由于 binlog 還沒寫,redo log 處于 prepare 狀態還沒提交,所以崩潰恢復的時候,這個事務會回滾,此時 binlog 還沒寫,所以也不會傳到備庫。

情況二:假設寫完 binlog 之后崩潰了,此時:

redolog 中的日志是不完整的,處于 prepare 狀態,還沒有提交,那么恢復的時候,首先檢查 binlog 中的事務是否存在并且完整,如果存在且完整,則直接提交事務,如果不存在或者不完整,則回滾事務。

情況三:假設 redolog 處于 commit 狀態的時候崩潰了,那么重啟后的處理方案同情況二。

由此可見,兩階段提交能夠確保數據的一致性。

責任編輯:武曉燕 來源: 江南一點雨
相關推薦

2024-05-21 14:12:07

2024-12-06 07:10:00

2023-01-18 10:35:49

MySQL數據庫

2023-12-05 09:33:08

分布式事務

2023-07-26 09:24:03

分布式事務分布式系統

2017-08-30 18:15:54

MySql

2018-10-29 08:44:29

分布式兩階段提交事務

2023-11-29 07:47:58

DDIA兩階段提交

2025-06-10 08:02:15

2022-12-21 19:04:35

InnoDBMySQL

2025-06-19 08:03:03

2024-01-26 08:18:03

2020-02-03 12:12:28

MySQL數據庫SQL

2024-07-22 08:57:58

2025-05-16 07:46:11

分布式事務服務

2021-10-12 19:12:15

單步實現系統

2025-12-15 09:11:57

2024-12-23 13:00:00

MySQLMVCC數據庫

2011-02-16 09:42:04

DevOps

2024-03-26 16:24:46

分布式事務2PC3PC
點贊
收藏

51CTO技術棧公眾號

国产精品亚洲不卡a| 亚洲精品视频在线观看网站| 欧美一区三区二区| 三级在线播放| |精品福利一区二区三区| av免费观看国产| 国产精品一区免费在线观看| 少妇特黄a一区二区三区| 99热免费精品| 久久精品国产精品青草色艺| 亚洲午夜极品| 91情侣偷在线精品国产| 日韩精品诱惑一区?区三区| 97色在线视频| 久久最新网址| 国产精品午夜视频| 激情婷婷综合| 国产精品色悠悠| 久久在线视频| 999国内精品视频在线| 亚洲最大黄网| 国产一区二区高清不卡| 久久www成人_看片免费不卡| 欧美日韩精品综合| 久久综合九色| 天天做天天爱天天高潮| 国产精品一区二区不卡| 久操手机在线视频| 2023国产精品视频| 九七伦理97伦理| 午夜电影网亚洲视频| 国产视频网站在线| 日韩欧美高清一区| 国产精品高潮久久| 国产做受69高潮| 日韩在线二区| 欧美精品一区二区三区四区五区| 日韩国产欧美视频| 蜜臀av无码一区二区三区| 国产亚洲一二三区| 偷偷要 色偷偷| 91电影在线观看| caoporn97在线视频| 一本色道久久88综合日韩精品| 疯狂欧洲av久久成人av电影| 91精品国产电影| 国产高清一区二区| 亚洲自拍偷拍二区| 国产精品美日韩| 精品999视频| 亚洲精品一区二区三区不| 亚洲一区电影| 国产精品一区二区免费| 国内外成人在线| 国产剧情av在线| 制服丝袜成人动漫| 91精品国产一区二区在线观看 | 天天干天天操天天做| 亚洲一级电影视频| 国产黄色大片在线观看| 欧美精品免费播放| 欧美视频在线观看| 99精品在线免费视频| 天天av天天翘天天综合网色鬼国产| 五月天婷婷在线视频| 色七七影院综合| 日韩免费av| 亚洲春色在线视频| 国产精品久久免费看| 污污片在线免费视频| 性欧美亚洲xxxx乳在线观看| 国产精品乱看| 成人av影视| 亚洲精品美女久久久| 精品免费一区二区| 成人av在线不卡| 在线亚洲+欧美+日本专区| 懂色av色香蕉一区二区蜜桃| 精品一区二区三区视频日产| 国产欧美精品一区二区色综合 | 日韩av不卡一区| 亚洲不卡一卡2卡三卡4卡5卡精品| 久久久久久久久伊人| 老司机在线永久免费观看| 欧美激情精品久久久久久黑人| 国产一区二区三区的电影| 成人免费观看在线网址| 日韩精品一二三四区| 午夜精品婷婷| 欧美一级特黄a| 亚洲韩国日本中文字幕| 正在播放日韩欧美一页 | 午夜免费在线观看精品视频| 日韩电影在线一区二区| 青檬在线电视剧在线观看| 一区三区二区视频| 最新亚洲一区| 国产1区2区3区| 中文字幕日韩av电影| 久久久久国产一区二区| 中文字幕网站视频在线| 美女久久久久久久久久久| 日韩在线卡一卡二| 福利片在线观看| 国产免费一区二区三区在线观看 | 亚洲444eee在线观看| 成人做爰视频www| 日韩一区国产在线观看| 日韩欧美国产黄色| 婷婷成人综合| 超碰超碰在线观看| 久久精品国产99国产精品澳门| 奇米一区二区三区| 九义人在线观看完整免费版电视剧| 欧美专区中文字幕| 国产日韩精品久久久| 国产福利亚洲| 午夜啪啪福利视频| 亚洲国产精久久久久久久| 亚洲高清网站| 黄色免费在线播放| 成人免费大片黄在线播放| 亚洲品质自拍视频| 人人网欧美视频| 亚洲 欧美 日韩系列| 久久久999精品| 成人h动漫精品一区二区| 麻豆mv在线观看| 香蕉久久免费影视| 精品国产乱码久久久久久老虎| 亚洲看片一区| 超碰公开在线| 亚洲天堂电影网| 亚洲欧美日韩国产精品| 国产精品456| 精品久久在线| 免费观看成人在线视频| 欧美xxxx做受欧美.88| 91影院在线观看| 大伊香蕉精品在线品播放| 国产视频手机在线播放| 欧美在线视频免费| 精品国产999| 亚洲日本激情| 黄色成人在线网| 狠狠干视频网站| 久久国产精品视频| 亚洲三级在线看| 亚洲欧美综合久久久| 麻豆网站视频在线观看| 一区二区在线不卡| 欧美精品在线免费播放| 亚洲综合在线五月| 最新成人av网站| 国模冰冰炮一区二区| 天天操天天摸天天爽| 成人黄色激情网| 精品国产百合女同互慰| 成人av电影在线网| av一区二区在线播放| 免费看a在线观看| 黄色成人在线看| 国产精品h片在线播放| 欧美日韩精品久久久| 精品一区二区免费视频| 日本久久伊人| 香蕉av一区| 日本中文字幕一级片| 欧美一级成年大片在线观看 | 在线天堂日本| 国产日韩欧美精品电影三级在线 | 国产经典一区| 国产又大又黄又猛| 国产在线一区二区三区| 欧美日韩中文精品| 成人手机电影网| 精品色999| 特级毛片在线| 无人在线观看的免费高清视频 | 黄色一级在线视频| 国产精品影院在线观看| 亚洲成人aaa| 免费h片在线观看| 午夜肉伦伦影院| 国产人妻777人伦精品hd| 99国产视频在线| 亚洲精品在线视频观看| 日韩精品亚洲视频| 中文字幕中文字幕一区| 国产综合精品一区| 东京一区二区| 免费h片在线| 国产精品日韩二区| 欧美老女人在线视频| 欧美日韩色一区| 欧美国产日本韩| 日韩成人免费在线| 欧美色就是色| 国产精品一区二区精品视频观看| 风间由美一区|