【MySQL篇05】:事務的 ACID 性(數據庫原理篇)

文章目錄

  • 一、事務的ACID特性
  • 二、數據庫原理例題與 ACID 特性判斷
  • 三、拓展(undolog 與 redolog)

一、事務的ACID特性

綜述:

  • 原子性(Atomicity):事務是不可分割的最小操作單元,要么全部成功,要么全部失敗
  • 一致性(Consistency):事務完成時,必須使所有的數據都保持一致狀態。
  • 隔離性(Isolation):數據庫系統提供的隔離機制,保證事務在不受外部并發操作影響的獨立環境下運行。
  • 持久性(Durability):事務一旦提交或回滾,它對數據庫中的數據的改變就是永久的
  1. 原子性(Atomicity):

    • 通俗類比: 就像你去ATM取錢。整個取錢操作(輸入密碼、選擇金額、出鈔、打印憑條)是一個原子操作。如果中間任何一步失敗了(比如機器故障沒出鈔),那么整個操作就會被撤銷,你的賬戶余額不會改變,就像你沒取過錢一樣。如果全部成功,你的賬戶余額才會減少,你拿到錢。
    • 核心思想: 事務中的所有操作要么作為一個整體被執行成功,要么作為一個整體被回滾(撤銷)。沒有中間狀態。
    • 實現方式: 通常通過日志(如Undo Log)來實現。如果事務執行過程中發生錯誤,系統會根據日志回滾到事務開始前的狀態。
  2. 一致性(Consistency):

    • 通俗類比: 想象一個銀行賬戶的總金額。在任何一個事務執行前后,所有賬戶的總金額應該保持不變(假設沒有外部資金流入流出)。如果你從賬戶A轉賬100元到賬戶B,事務開始前,A+B的總金額是X。事務結束后,A減少100,B增加100,A+B的總金額仍然是X。這就是一致性。
    • 核心思想: 事務必須使數據庫從一個一致性狀態轉換到另一個一致性狀態。一致性狀態是指數據庫滿足所有的預定義規則和約束(例如,主鍵唯一、外鍵引用有效、余額不能為負等)。
    • 實現方式: 依賴于原子性、隔離性、持久性,以及數據庫本身的約束(如外鍵約束、唯一性約束、Check約束等)。程序員編寫的業務邏輯也需要保證一致性。
  3. 隔離性(Isolation):

    • 通俗類比: 想象你在圖書館看書,旁邊有人也在看書。隔離性就像是你們之間有隔板,互不影響。你在翻頁、做筆記,旁邊的人也在做自己的事情,你們不會看到對方操作的中間狀態,也不會互相干擾。
    • 核心思想: 并發執行的事務之間互不干擾,每個事務都感覺自己是系統中唯一正在運行的事務。一個事務的中間結果對其他事務是不可見的。
    • 實現方式: 數據庫提供了多種隔離級別(如讀未提交、讀已提交、可重復讀、串行化),通過鎖機制、多版本并發控制(MVCC)等技術來實現不同程度的隔離。
  4. 持久性(Durability):

    • 通俗類比: 你在電腦上寫了一篇文檔,點擊了“保存”。即使電腦突然斷電,當你重新開機時,你保存的文檔依然存在。這就是持久性。
    • 核心思想: 一旦事務提交成功,它對數據庫數據的改變就是永久性的,即使系統發生故障(如斷電、崩潰)也不會丟失。
    • 實現方式: 通常通過將事務的修改寫入到日志文件(如Redo Log)中來實現。即使數據還沒有完全寫入磁盤,只要相關的日志已經寫入磁盤,系統恢復時就可以通過日志來重做(Redo)這些操作,恢復到事務提交后的狀態。

二、數據庫原理例題與 ACID 特性判斷

下面我們通過一些例子來幫助你判斷和理解這些特性。請判斷每個例子主要體現了事務的哪種 ACID 特性。

例題 1:

你在一個電商網站上下單購買商品。這個操作包括:

  1. 從庫存表中減少商品數量。
  2. 在訂單表中插入一條新的訂單記錄。
  3. 從用戶余額中扣除支付金額。

如果在執行過程中,扣除用戶余額時發生了網絡錯誤導致失敗,整個下單操作被取消,庫存數量和訂單記錄都沒有發生改變。

請問:這個例子主要體現了事務的哪種特性?為什么?

答案與解析:

這個例子主要體現了事務的 原子性(Atomicity)

原因:整個下單過程被視為一個不可分割的單元。當其中一個步驟(扣除用戶余額)失敗時,整個事務被回滾,之前已經執行的步驟(減少庫存、插入訂單)也被撤銷,系統回到了事務開始前的狀態。這符合原子性“要么全部成功,要么全部失敗”的定義。

例題 2:

一個銀行系統中有規定:所有賬戶的總金額必須大于等于零。
現在有兩個賬戶 A 和 B,A 有 1000元,B 有 500元。
一個事務從 A 賬戶轉賬 200元到 B 賬戶。
事務執行完成后,A 賬戶變為 800元,B 賬戶變為 700元。
此時,所有賬戶的總金額(800 + 700 = 1500)仍然大于等于零,符合銀行系統的規定。

請問:這個例子主要體現了事務的哪種特性?為什么?

這個例子主要體現了事務的 一致性(Consistency)

原因:事務執行前后,數據庫從一個一致性狀態(所有賬戶總金額 >= 0)轉換到了另一個一致性狀態(所有賬戶總金額 >= 0)。盡管賬戶A和B的金額發生了變化,但它們的變化是相互抵消的,維護了數據庫的業務規則和約束。

例題 3:

兩個用戶同時嘗試購買同一件限量商品。
用戶 A 的事務開始執行,查詢到商品庫存為 1。
用戶 B 的事務幾乎同時開始執行,也查詢到商品庫存為 1。
用戶 A 的事務執行扣減庫存操作,庫存變為 0,然后提交。
用戶 B 的事務也執行扣減庫存操作,如果隔離性不好,它可能會在用戶 A 提交前就看到庫存為 1,然后也嘗試扣減,導致庫存變為 -1(超賣)。
但由于數據庫的隔離機制,用戶 B 在嘗試扣減庫存時,會發現庫存已經被用戶 A 修改為 0,從而導致用戶 B 的扣減庫存操作失敗(或者被阻塞等待)。最終只有一個用戶購買成功,庫存變為 0。

請問:這個例子主要體現了事務的哪種特性?為什么?

這個例子主要體現了事務的 隔離性(Isolation)

原因:在并發環境下,多個事務同時訪問和修改相同的數據。隔離性確保了每個事務的執行不受其他并發事務的干擾。在這個例子中,良好的隔離性防止了“超賣”問題的發生,保證了用戶 B 在用戶 A 提交后能夠看到最新的庫存狀態,避免了基于過期數據進行操作。

例題 4:

你成功地完成了一筆訂單支付,事務提交成功。
即使緊接著數據庫服務器發生了突然的斷電,當你重新啟動數據庫后,查詢訂單列表,仍然能夠找到剛才支付成功的訂單記錄,并且你的賬戶余額也確實被扣除了。

請問:這個例子主要體現了事務的哪種特性?為什么?

這個例子主要體現了事務的 持久性(Durability)

原因:一旦事務提交成功,其對數據庫的修改就被認為是永久的,即使系統發生故障,這些修改也不會丟失。數據庫通過將提交的事務信息寫入日志等方式來保證數據不會因為意外情況而丟失。


三、拓展(undolog 與 redolog)

Q1: 詳細解釋一下,數據庫是如何實現 原子性 的嗎?特別是當事務執行到一半發生崩潰時,數據庫如何確保之前已經執行的操作被撤銷?

A: 原子性是通過日志來實現的。數據庫會記錄事務的每一步操作。如果事務失敗了,就可以根據日志把已經執行的操作撤銷掉,回到事務開始前的狀態。

Q2: “日志”具體是指哪種日志?撤銷操作的原理是什么?

A: 數據庫主要依賴 Undo Log 來實現原子性。Undo Log 記錄了數據修改前的值。如果事務需要回滾,系統會讀取 Undo Log,根據日志中記錄的舊值將數據恢復到修改前的狀態。

Q3: 那么,Undo Log 是在事務提交后才清除嗎?如果在事務提交前數據庫崩潰了,Undo Log 起什么作用?

A: Undo Log 不是在事務提交后立即清除,而是會保留一段時間,直到相關的事務徹底完成并且不再需要回滾。如果在事務提交前數據庫崩潰了,當數據庫重啟進行恢復時,會檢查未完成的事務,并利用 Undo Log 將這些未完成事務已經進行的修改回滾,確保這些事務是“不存在”的,這正是原子性的體現。

Q4: 你提到了 Undo Log 用于回滾。那么,持久性 是如何保證的呢?它依賴哪種日志?如果事務提交后,數據還沒完全寫入磁盤,但日志已經寫入了,然后數據庫崩潰了,數據還能恢復嗎?

A: 持久性主要依賴 Redo Log。Redo Log 記錄了數據修改后的值。當事務提交時,數據庫會確保 Redo Log 相關的記錄已經寫入磁盤。即使數據頁本身還沒來得及寫入磁盤,只要 Redo Log 已經持久化了,系統恢復時就可以通過讀取 Redo Log 來重做(Redo)這些操作,將數據恢復到事務提交后的狀態。

Q5: 所以,Redo LogUndo Log 在保證ACID特性中扮演了不同的角色。你能總結一下它們各自的主要作用嗎?

A: 好的。簡單來說,Undo Log 主要用于保證 原子性,它記錄了數據修改前的狀態,用于回滾事務。Redo Log 主要用于保證 持久性,它記錄了數據修改后的狀態,用于在系統崩潰恢復時重做已提交的事務。它們是數據庫實現事務ACID特性的重要底層機制。

Q6: 你提到了 隔離性 有不同的級別,比如讀未提交、讀已提交、可重復讀、串行化。你能簡單解釋一下“讀未提交”隔離級別可能帶來的問題嗎?

A: 讀未提交(Read Uncommitted)是隔離級別最低的。它允許一個事務讀取另一個未提交事務的修改。這可能導致 臟讀(Dirty Read) 問題。例如,事務A修改了一行數據但還沒有提交,事務B讀取了這行被修改但未提交的數據。如果事務A隨后回滾了這次修改,那么事務B讀取到的數據就是無效的、不存在的數據,這就是臟讀。

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

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

相關文章

crawl4ai 框架的入門講解和實戰指南——基于Python的智能爬蟲框架,集成AI(如NLP/OCR)實現自動化數據采集與處理

一、crawl4ai 框架簡介 1. 框架定位 核心功能:基于Python的智能爬蟲框架,集成AI(如NLP/OCR)實現自動化數據采集與處理 關鍵特性: 零配置快速啟動(自動識別網頁結構) 內置反反爬機制&#xff…

受夠垃圾翻譯!CodeBuddy 8 分鐘造神器,劃詞秒翻 + 自動適配所有網頁

本文所使用的 CodeBuddy 免費下載鏈接:騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 作為一個天天泡在 GitHub 上扒項目的人,翻譯問題簡直是我 “挖寶” 路上的頭號絆腳石!想研究國外大神的優質開源項目,不是被機翻軟…

零基礎設計模式——總結與進階 - 2. 反模式

第五部分:總結與進階 - 2. 反模式 (Anti-Patterns) 在軟件開發中,我們追求良好的設計模式以構建健壯、可維護的系統。然而,同樣存在一些常見的、導致不良后果的解決方案,這些被稱為“反模式”。理解反模式,可以幫助我…

音視頻流媒體高級開發-學習路線

原文作者:Linux 原文鏈接:音視頻流媒體高級開發-學習路線 如果你想往音視頻方向發展,那么本文一定要認真閱讀~ 大家都知道音視頻開發薪資高、門檻高、發展空間大,心里蠢蠢欲動,卻不知道怎么入門,怎么進階…

LINUX 通過rsync同步 免密備份

1,增加免密碼用戶密碼 useradd backup echo "5566777" | passwd --stdin backup echo "backup ALL(ALL) ALL" >> /etc/sudoers # 源服務器操作 ssh client_usersource_server ssh-keygen -t rsa # 一路回車 ssh-copy-id serv…

在使用 HTML5 的 <video> 標簽嵌入視頻時,有時會遇到無法播放 MP4 文件的問題

原因分析: 只能播放聲音,卻無法播放視頻。這通常是由于視頻編碼格式不兼容導致的。雖然 MP4 是一種常見的視頻格式,但它包含多種編碼方式,并非所有編碼方式都受 HTML5 支持。 解決方案: 確認視頻編碼格式: …

【bugfix】記一次Spring Boot 配置層級錯誤導致數據庫連接失敗

前言:為什么你的數據庫配置讀不到? 在 Spring Boot 項目中,配置文件的層級(prefix) 是決定屬性能否被正確解析的核心因素。一個看似微小的縮進錯誤,可能導致整個應用的數據庫連接失敗、服務啟動異常&#…

wpf 隊列(Queue)在視覺樹迭代查找中的作用分析

文章目錄 隊列(Queue)在視覺樹迭代查找中的作用分析示例代碼一、隊列的核心作用1. 替代遞歸的迭代機制2. 實現廣度優先搜索(BFS) 二、隊列的工作流程1. 初始化階段2. 處理循環 三、隊列操作的詳細步驟查找過程分解: 四、為什么使用隊列而不是其他數據結構1. 與棧(St…

快手數據開發面試SQL題:取窗口內排名第一和排名倒數第一的作為兩個字段輸出

目錄 問題描述 樣例數據表 sales 解決方案 第三步:使用條件聚合將多行合并為單行輸出" 步驟1:計算排名的中間結果 中間結果輸出: 步驟2:最終查詢(處理并列情況) 最終輸出結果: 關鍵點解釋: RANK() OVER (PARTITION BY group_id ORDER BY amount DESC):…

第十六屆藍橋杯國賽(2025)C/C++B組 藍橋星數字 獨家解析

這題我中午是12點以后開始做的,只剩下1個小時了,12點50的時候完成了框架,但是細節總是實現不對,現在晚上來復盤的時候才把這題A出來了。 但是,就像高考的導數你整個思路都會,你死在了求導上。。。&#xf…

Google 的 Protocol Buffers 介紹

Protocol Buffers(簡稱 Protobuf)是由 Google 開發的一種高效、靈活、跨語言的數據序列化協議,廣泛用于網絡通信、分布式系統、持久化存儲等場景。 一、什么是 Protocol Buffers? Protocol Buffers 是一種結構化的數據交換格式,類似于 XML 和 JSON,但更小、更快、更簡單…

犀思云Fusion WAN與阿里云NIS深度融合,實現端到端智能可觀測

隨著“AI數智化”浪潮逐步深入行業,企業網絡的復雜與故障感知日漸凸顯。如何實現網絡的高效運維、智能診斷與全域可視化管理,已成為企業上云的核心挑戰。 近日,犀思云與阿里云達成深度產品級合作,將阿里云網絡智能服務&#xff0…

基于gec6818的環境監測系統設計

一、設計要求 將環境中溫濕度數值、環境的光照強度和煙霧的信息獲取到開發板,顯示在圖形界面上。當溫度值高于閾值時,溫度指示燈變紅、蜂鳴器告警并且啟動直流電機正轉降溫;當濕度值高于閾值時,濕度指示燈變紅、蜂鳴器告警并且繼電器吸合接通…

c++中std::transform詳解和應用代碼示例

std::transform 是 C 標準庫中非常常用的算法之一&#xff0c;屬于 <algorithm> 頭文件。它的作用是將一個&#xff08;或兩個&#xff09;序列中的元素通過某個函數進行變換&#xff0c;并將結果輸出到另一個序列中。 一、std::transform 作用總結 std::transform 支持…

Yolov5 使用

1.開發背景 在已有的 Conda 環境下實現目標檢測標定。 2.開發需求 實現演示例子的圖片標定。 3.開發環境 Ubuntu20.04 Conda Yolov5 4.實現步驟 4.1 安裝環境 # 創建環境 python 版本建議 3.9 以上 conda create -n yolov5 python3.9# 進入環境 conda activate yolov5# …

資深Java工程師的面試題目(四)性能優化

以下是針對Java性能優化的面試題&#xff0c;涵蓋前后端技術棧的常見優化方式&#xff0c;適合評估候選人對性能調優的理解和實際應用能力&#xff1a; 1. JVM性能調優 題目: 請說明JVM垃圾回收&#xff08;GC&#xff09;的常見類型及其適用場景&#xff0c;并描述如何通過J…

火山引擎TTS使用體驗

文章目錄 前言1. 簡介1.1 能力體驗1.2 功能特性1.3 音色列表1.4 收費情況 2. 開啟服務2.1 創建應用2.3 使用服務介紹 3.Websocket接入演示3.1 編寫demo3.2 代碼解釋3.4運行demo 4. 參考鏈接 前言 語音合成TTS&#xff08;text to Speech&#xff09;是我覺得后續開發產品所不可…

Django中使用流式響應,自己也能實現ChatGPT的效果

最近在研究ChatGPT的時候&#xff0c;想通過openai提供的接口使國內用戶也可以無限制訪問&#xff0c;于是打算基于django開發一款應用。頁面的渲染也得想ChatGPT一樣采用流式響應&#xff0c;django中StreamingHttpResponse是支持流式響應的一種方式。 django 代碼 class Ch…

Python Redis 簡介

Redis 是一個高性能的內存鍵值數據庫&#xff0c;支持多種數據結構&#xff08;字符串、列表、哈希、集合等&#xff09;&#xff0c;常用于緩存、消息隊列和實時數據處理。Python 通過 redis-py 庫與 Redis 交互。 核心功能 內存存儲&#xff1a;數據存儲在內存中&#xff0c…

mac安裝whistle代理抓包工具(支持mock)

工具地址&#xff1a;https://wproxy.org/whistle/ 1、 安裝nodejs環境 參考方法&#xff1a;https://github.com/nvm-sh/nvm 1&#xff09;安裝 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.3/install.sh | bash如圖&#xff0c;安裝成功 2&#xff09;…