InnoDB ACID實現:數據庫可靠性的核心秘密

這段內容出自 MySQL 官方文檔第 17.2 節《InnoDB 與 ACID 模型》,深入解釋了 InnoDB 是如何實現 ACID 特性 的。ACID 是數據庫系統中最核心的設計原則,確保數據在各種異常情況下依然可靠、一致、安全

我們來逐部分解析并通俗理解:


🔷 什么是 ACID 模型?

ACID 是四個英文單詞的首字母縮寫,代表數據庫事務必須滿足的四個關鍵屬性:

字母含義中文
AAtomicity原子性
CConsistency一致性
IIsolation隔離性
DDurability持久性

? ACID 的目標:即使遇到軟件崩潰、硬件故障、斷電等意外情況,數據庫中的數據也不會損壞,事務的結果是可預測且可靠的。


🔷 一、A:原子性(Atomicity)

“要么全做,要么全不做。”

📌 核心思想:

一個事務中的所有操作被視為一個不可分割的整體。如果其中任意一步失敗,整個事務都會被回滾(rollback),就像什么都沒發生過。

💡 InnoDB 如何實現原子性?

  • COMMIT:只有當你顯式執行 COMMIT,事務中所有修改才會真正寫入數據庫。
  • ROLLBACK:如果中途出錯或你主動執行 ROLLBACK,所有已做的更改都會撤銷。
  • autocommit 設置
    • 默認開啟(autocommit=1):每條 SQL 語句自動作為一個事務提交。
    • 關閉時(autocommit=0):你可以手動控制事務邊界,進行多語句事務處理。

? 示例:

START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;
-- 如果第二條失敗,第一條也會被撤銷
COMMIT;

🔍 內部機制:InnoDB 使用 undo log(回滾日志) 記錄事務執行前的數據狀態,用于回滾。


🔷 二、C:一致性(Consistency)

“數據庫始終處于合法狀態。”

📌 核心思想:

事務執行前后,數據庫從一個一致的狀態轉移到另一個一致的狀態。比如外鍵約束、唯一索引、數據類型規則都不能被破壞。

?? 注意:

“一致性”不是由 InnoDB 單獨保證的,而是 ACID 四者共同作用的結果

  • 原子性防止部分更新;
  • 隔離性防止并發干擾;
  • 持久性防止數據丟失;
  • 加上約束(如外鍵、CHECK)等,最終保證“一致性”。

💡 InnoDB 如何幫助實現一致性?

  • 雙寫緩沖區(Doublewrite Buffer)

    • 在將數據頁寫入磁盤前,先寫入一個“雙寫緩沖區”。
    • 防止“部分寫”(partial page write)問題:即寫了一半的頁在崩潰時導致數據損壞。
    • 寫完整后再寫入真正的表空間文件。
  • 崩潰恢復(Crash Recovery)

    • 啟動時自動檢查 redo log 和 undo log。
    • 提交了的事務重做(redo),未提交的事務回滾(undo),確保數據回到一致狀態。

📚 舉例:轉賬操作不能讓錢“憑空消失”,也不能“多出來”,這就是一致性。


🔷 三、I:隔離性(Isolation)

“并發執行的事務互不干擾。”

📌 核心思想:

多個事務同時運行時,彼此之間的影響應盡可能小,避免出現臟讀、不可重復讀、幻讀等問題。

💡 InnoDB 如何實現隔離性?

  • 事務隔離級別(Transaction Isolation Levels)
    MySQL 支持四種標準隔離級別,InnoDB 都支持:
隔離級別能防止的問題性能影響實現機制簡述
READ UNCOMMITTED最高(但危險)不加鎖,直接讀最新數據,不管其他事務是否提交。
READ COMMITTED臟讀較高使用 一致性非鎖定讀。在每個語句執行時,都會讀取已提交的最新快照。避免了寫阻塞讀,但同一個事務內兩次相同的查詢可能結果不同(不可重復讀)。
REPEATABLE READ(默認)臟讀、不可重復讀中等使用 一致性非鎖定讀。在事務開始時創建一致性視圖,整個事務期間都基于這個視圖讀取。保證了可重復讀。InnoDB 還通過 Next-Key Locking 機制避免了幻讀。
SERIALIZABLE所有問題最低(完全串行)將所有普通的 SELECT 語句隱式轉換為 SELECT … FOR SHARE(加共享鎖),讀寫會相互阻塞,實現完全串行。
  • InnoDB 的默認隔離級別是 REPEATABLE READ,但它通過 MVCC(多版本并發控制) 實現了“快照讀”,避免了大部分鎖競爭。

  • 行級鎖 + 間隙鎖(Gap Lock)

    • 防止幻讀(phantom reads)。
    • 鎖定記錄及其“間隙”,確保范圍查詢結果穩定。
  • 可通過以下方式監控鎖狀態

    SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;        -- 當前事務
    SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;      -- 鎖信息(MySQL 5.7 及以前)
    SELECT * FROM performance_schema.data_locks;        -- MySQL 8.0 推薦方式
    

🔷 四、D:持久性(Durability)

“一旦提交,數據就永久保存。”

📌 核心思想:

事務一旦提交,即使系統崩潰、斷電,數據也不會丟失。

💡 持久性是 ACID 中最復雜的,因為它不僅依賴軟件,還依賴硬件和系統配置

🔧 InnoDB 和 MySQL 如何實現持久性?

組件作用
innodb_flush_log_at_trx_commit控制 redo log 刷盤策略:
? 1:每次事務提交都刷盤(最安全,性能略低)
? 0:每秒刷一次(性能高,可能丟1秒數據)
? 2:提交時寫日志但不刷盤(折中)
sync_binlog控制 binlog 刷盤頻率:
? 1:每次事務都同步到磁盤(推薦用于主從復制)
雙寫緩沖區(Doublewrite Buffer)再次出現,防止頁寫入不完整導致數據損壞
innodb_file_per_table每個表獨立文件,便于管理與恢復
存儲設備的寫緩存(Write Cache)如 SSD、RAID 卡的緩存,但斷電會丟數據 → 需配合電池或電容
帶電池的緩存(BBWC)RAID 卡帶電池,斷電時可將緩存數據寫入磁盤
操作系統 fsync()確保數據真正寫入物理磁盤,而非停留在 OS 緩存中
UPS(不間斷電源)防止突然斷電,給系統留出時間安全關閉
備份策略定期全量 + 增量備份,是持久性的最后一道防線

📌 持久性是“軟硬結合”的結果
即使 InnoDB 寫了日志,但如果硬盤緩存沒電、UPS 沒有、fsync 被繞過,數據仍可能丟失。


🔷 總結:ACID 的實現機制一覽

ACID 屬性InnoDB/MySQL 實現機制
A 原子性COMMIT / ROLLBACKautocommit、undo log
C 一致性崩潰恢復、雙寫緩沖、外鍵、約束、MVCC、事務機制共同保障
I 隔離性隔離級別、MVCC、行鎖、間隙鎖、臨鍵鎖
D 持久性redo log、innodb_flush_log_at_trx_commitsync_binlog、雙寫緩沖、硬件(UPS、BBWC)、備份

🔍 補充:ACID 的“權衡”(Trade-off)

文檔中提到:

“在某些情況下,如果你有額外的軟件保護、超可靠硬件,或者應用能容忍少量數據丟失,可以犧牲一些 ACID 可靠性來換取更高性能。”

📌 舉例:

  • innodb_flush_log_at_trx_commit = 2:性能提升,但極端情況下可能丟失最近提交的事務。
  • 使用 READ COMMITTED 而非 REPEATABLE READ:減少鎖爭用,提高并發。
  • 關閉雙寫緩沖(不推薦):提升寫性能,但增加數據損壞風險。

?? 生產環境建議保持默認安全設置,除非你清楚后果并有其他補償機制。


? 一句話總結:

InnoDB 通過 undo log、redo log、雙寫緩沖、MVCC、行鎖、隔離級別等機制,結合操作系統和硬件支持,全面實現了 ACID 事務特性,確保了數據在高并發、異常情況下的可靠性、一致性和持久性。

理解 ACID 不僅是理解 InnoDB 的核心,更是理解現代關系型數據庫如何“安全地處理數據”的基礎。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/100497.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/100497.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/100497.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CoolUtils Total Excel Converter:全能的 Excel 文件轉換工具

一、軟件簡介 CoolUtils Total Excel Converter 是一款功能強大的 Excel 文件轉換工具,專為高效處理和轉換 Excel 文件而設計。它支持將 Excel 文件(包括 XLS 和 XLSX 格式)轉換為多種常見的文件格式,如 PDF、CSV、HTML、TXT 等&…

告別靜態圖譜!TextSSL如何用「稀疏學習」實現更智能的文檔分類?

文章鏈接:https://mp.weixin.qq.com/s/danmd9lSQpmck4tVsM37bQ 今天分享一篇將圖神經網絡應用于文本分類的創新模型——TextSSL。在傳統的文檔理解中,模型往往難以同時捕捉文本的局部句法細節和全局語義關聯。針對這一挑戰,TextSSL提出了一種…

開源商城mall項目功能評估與優化建議

項目地址:https://github.com/macrozheng/mall 開源項目是大多數程序員用來練手的最好途徑,但是技術面和技術深度同樣重要。一個商城項目能夠稱之為商城不光有基礎的商品后臺管理、移動端、支付管理,要打造一個全鏈路的生態系統,…

我的頁面開發

我的頁面開發 后端data\me_page.js我的頁面靜態數據module.exports () > {return {superCard: {beanCount: 1555,tips: "下單得5倍吃貨豆,兌專享紅包",},cards: [{label: "常用功能",size: 30,items: [{iconUrl: "/imgs/me_page/coupang.png"…

Java Swagger2 能顯示頁面但看不到一個接口

反復檢查之后,發現問題出在的代碼如下: ApiModelProperty(value "材料鏈接地址", example "{ApiHost}/storage/test.pdf")private String url; 結論:example的值包括了 { 和 } ,導致網頁解析的JSON數據失敗…

2025年- H143-Lc344. 反轉字符串(字符串)--Java版

1.題目2.思路 方法一&#xff1a;比如有5個元素 s[0],s[1],s[2],s[3],s[4] 反轉之后對應 s[4],s[3],s[2],s[1],s[0] 所以s[0]s[4], s[1]s[3] s[i]s[n-1-i] 方法2:雙指針 left0,rights.length-1; 當left<right的時候&#xff0c;交換兩個元素的位置&#xff0c;左指針左移&am…

微服務高可用流程講解

如何理解從前端nginx到后端微服務高可用架構問題&#xff0c;下面從nginx、gateway、nacos、各個服務節點的角度講解下應該如何進行高可用&#xff0c;比如nginx是前端向后端進行的負載均衡&#xff0c;也相當于均衡地向各個gateway網關進行請求&#xff0c;再由gateway網關拉取…

留個檔,Unity,Animation控制相機,出現抖動的問題記錄

起因是項目用了一段高度自定義的過程復雜的相機Animation&#xff0c;來控制虛擬相機位移旋轉。 發現在不同的電腦上&#xff0c;出現了不同程度的抖動。 搜索過程中&#xff0c;發現關鍵詞&#xff1a;World Origin Rebasing。 Unity 世界坐標使用 float&#xff08;單精度浮點…

組合對沖策略(外匯版)

在復雜多變的外匯市場中&#xff0c;投資者常常面臨著匯率波動帶來的風險。為了降低這種風險&#xff0c;對沖策略成為了一種有效的風險管理工具。以下將詳細介紹三種組合對沖策略&#xff0c;它們分別是基于多貨幣正負相關對沖、區域性貨幣對沖以及全日元貨幣對沖的策略。①多…

GPT-5-Codex 正式發布:邁向真正的“自主編程”時代

在 Anthropic Claude 近期遭遇爭議的同時&#xff0c;OpenAI 推出了其編程領域的王牌產品——GPT-5-Codex。這并非簡單的模型升級&#xff0c;而是基于 GPT-5 專為“自主編程”&#xff08;Autonomous Programming&#xff09;場景深度優化的專用版本&#xff0c;標志著 AI 編程…

java面試:了解redis的集群么,怎么通過redis的集群來實現redis的高可用?

我們知道&#xff0c;為了幫助數據庫緩解高并發的壓力&#xff0c;我們會上reids緩存幫助數據庫分攤&#xff0c;雖說常見場景的并發量還不足以讓redis宕機&#xff0c;但假設出現了極高的并發場景&#xff0c;redis依舊是有宕機的可能的&#xff0c;畢竟單點部署的redis容易出…

氧氣科技亮相GDMS全球數字營銷峰會,分享AI搜索時代GEO新觀

2025年9月16日&#xff0c;全球數字營銷領域的年度盛會——GDMS&#xff08;Global Digital Marketing Summit&#xff09;在上海國家會展中心盛大舉行。作為品牌數字化轉型的風向標&#xff0c;本屆峰會匯聚來自全球的CEO、CMO、CDO及營銷領域高管&#xff0c;共同探討AI驅動下…

搭建Gin通用框架

Gin Web 開發腳手架技術文檔 項目概述 本項目是一個基于 Gin 框架的 Go Web 開發腳手架模板&#xff0c;提供了完整的項目結構、配置管理、日志記錄、MySQL 和 Redis 數據庫連接等常用功能集成。 項目結構 gindemo/ ├── gindemo.exe # 編譯后的可執行文件 ├── g…

windows 平臺下 ffmpeg 硬件編解碼環境查看

環境&#xff1a; 1&#xff0c;nvidia 顯卡 2&#xff0c;驅動安裝 powershell 下 執行如下命令&#xff0c;出現GPU信息 說明驅動安裝正常。 nvidia-smi 3&#xff0c;安裝支持 NVENC 的 FFmpeg &#xff08;1&#xff09;Windows 下 編譯 FFmpeg 需要 CUDA Toolkit &am…

08_多層感知機

1. 單層感知機 1.1 感知機① 線性回歸輸出的是一個實數&#xff0c;感知機輸出的是一個離散的類。1.2 訓練感知機 ① 如果分類正確的話y<w,x>為正數&#xff0c;負號后變為一個負數&#xff0c;max后輸出為0&#xff0c;則梯度不進行更新。 ② 如果分類錯了&#xff0c;y…

安卓實現miniLzo壓縮算法

LZO官方源碼 http://www.oberhumer.com/opensource/lzo 找到miniLZO點擊Dowload miniLZO下載源碼 http://www.oberhumer.com/opensource/lzo/download/minilzo-2.10.tar.gz demo源碼(包含安卓) https://github.com/xzw421771880/MiniLzo_Mobile.git 1.代碼部分 1.1.測試…

如何在ubuntu下用pip安裝aider,解決各種報錯問題

aider中文文檔網站上給出的安裝說明比較簡單&#xff1a; https://aider.doczh.com/docs/install.html 但是在一個干凈的ubuntu環境中按文檔中的命令安裝時&#xff0c;會報錯&#xff0c;經過一番嘗試之后&#xff0c;解決了報錯問題&#xff0c;成功完成了安裝。 成功安裝執…

Kotlin flow詳解

流式數據處理基礎 Kotlin Flow 是基于協程的流式數據處理 API&#xff0c;要深入理解 Flow&#xff0c;首先需要明確流的概念及其處理方式。 流(Stream)如同水流&#xff0c;是一種連續不斷的數據序列&#xff0c;在編程中具有以下核心特征&#xff1a; 數據按順序產生和消費支…

DeepSeek V3 深度解析:MoE、MLA 與 GRPO 的架構革新

簡介 DeepSeek&#xff08;深度求索&#xff09;是一家源自中國的人工智能公司&#xff0c;成立于2023年&#xff0c;總部位于中國杭州。前身是國內量化投資巨頭幻方量化的子公司。公司專注于開發低成本、高性能的AI模型&#xff0c;致力于通過技術創新推動人工智能技術的普惠…

Flask學習筆記(三)--URL構建與模板的使用

一、URL構建url_for()函數對于動態構建特定函數的URL非常有用。 該函數接受函數的名稱作為第一個參數&#xff0c;并接受一個或多個關鍵字參數&#xff0c;每個參數對應于URL的變量部分。from flask import Flask, redirect, url_forapp Flask(__name__)app.route(/admin)def …