關于數據庫的ACID幾點

首先的話就是關于ACID,最重要的就是原子性了,這是基礎。

原子性是指事務包含的所有操作,要么全部完成,要么全部不完成。如果不能保證原子性,可能會出現以下問題:

數據不一致:事務中的部分操作可能對數據做出了更改,而其他操作由于某種原因(如系統故障、操作錯誤等)未能完成,導致數據狀態不一致。
資源泄露:如果一個操作分配了資源(如內存或文件描述符)而未能成功地釋放或回滾,可能會導致資源泄露。
系統可靠性下降:當多個事務相互依賴時,一個事務的部分完成可能導致其他事務無法繼續,影響系統的整體可靠性。
假如你在網上購物,支付環節需要從你的銀行賬戶扣款,并將相應金額增加到商家賬戶。如果扣款成功,但增款失敗,沒有原子性的保護,你的賬戶會減少相應的金額,而商家卻沒有收到錢,導致交易不公平。

MySQL怎么保證原子性的?
MySQL通過事務(Transaction)來保證原子性。事務是一個不可分割的工作單位,事務內的操作要么全部完成,要么全部不完成,這就是原子性。

在MySQL中,為了保證事務的原子性,它使用了以下兩種主要的技術:

Undo Log(撤銷日志): Undo Log記錄了事務執行前的舊數據信息,當事務執行過程中出現錯誤,或者用戶執行ROLLBACK語句進行事務回滾時,可以利用Undo Log中的信息將數據庫恢復到事務開始前的狀態
Redo Log(重做日志): 當MySQL異常宕機時,Redo Log可以用來恢復正在執行中的事務。它記錄了事務中所有的修改操作,用于在MySQL重啟后,重新執行這些操作以保證數據一致性。
這兩種日志機制的結合使用,即在出現錯誤回滾中使用Undo Log,和在系統崩潰時利用Redo Log進行恢復,使MySQL可以成功保證事務的原子性。

需要注意的是只有使用了InnoDB存儲引擎的MySQL支持事務,MyISAM存儲引擎并不支持事務。

如果無法保證隔離性會怎么樣?
如果數據庫無法保證事務的隔離性,將會出現以下并發問題:

臟讀(Dirty Reads):當一個事務可以讀取另一個事務未提交的數據時,若后者回滾,則前者讀取到的就是不正確的數據。
不可重復讀(Non-repeatable Reads):在一個事務的兩次查詢之間,另一個并發事務進行了更新操作,導致第一個事務兩次讀到的數據不一致。
幻讀(Phantom Reads):當一個事務重新讀取之前查詢過的數據范圍時,發現有其他事務新增的記錄,看似產生了"幻影"數據。
丟失更新(Lost Updates):兩個事務同時讀取相同的數據并更新它,可能會導致其中一個事務的更新被覆蓋。
例如,如果銀行系統無法保證隔離性,在處理多個客戶的轉賬操作時可能會出現資金計算錯誤。一個客戶的轉賬可能會基于另一個客戶正在處理但未完成的交易,最終導致資金總額的不一致。

MySQL怎么保證隔離性的?
MySQL保證隔離性主要是通過所謂的“隔離級別”實現的。隔離性是指并發執行的事務之間不相互影響,每個事務都感覺好像自己在獨占系統。

在MySQL中,支持四種隔離級別:

讀未提交 (READ UNCOMMITTED):在該級別下,一個事務可以讀取到另一個事務修改但還未提交的數據,也被稱為"臟讀"。這種隔離級別并發性最好,但是一般很少使用,因為它可能讀取到未提交的數據。
讀已提交 (READ COMMITTED):這是大多數數據庫系統的默認隔離級別(但不是MySQL默認的)。它滿足了隔離的基本要求,一個事務只能讀取已經提交的數據。
可重復讀(REPEATABLE READ):在同一事務內的查詢都能夠看到一致的快照數據。也就是說,在事務開始后,無論其他事務如何修改數據,本事務都能看到同樣的數據。MySQL默認的隔離級別就是REPEATABLE READ。在該級別下,除了防止"臟讀",還防止了"不可重復讀"。
串行化(SERIALIZABLE):這是最高的隔離級別,它要求所有事務都串行執行。也就是說,同一時間只能有一個事務在執行。雖然可以提供最高級別的隔離性,但是在并發環境中性能開銷也是最大的。
在InnoDB存儲引擎中,另一個叫做"多版本并發控制(MVCC)"的技術也對事務的隔離色提供支持。每次對數據的更新操作,InnoDB都會為該數據創建一個新的版本,而不是在原數據上直接修改,這樣就可以通過讀取舊版本的數據來避免阻塞讀操作,增強并發性能,從而保證隔離性。

如下圖所示為隔離級別與并發問題的關系:

如果無法保證持久性會怎么樣?
如果無法保證持久性,那么在事務提交后,如果發生系統崩潰或者其他故障,那么這個事務的修改結果可能會丟失,沒有被永久的保存在數據庫中。

持久性是指當事務被認為是已經結束時,對數據的改變就是永久性的。該特性保證了即使在系統崩潰或者電源故障后,已經提交的數據仍然可以保持,不會丟失。

比如:假設某電商網站使用MySQL數據庫來存儲用戶訂單信息。這個訂單首先被創建并存儲在數據庫的內存緩沖區中,等待最終被寫入到磁盤上的數據庫文件,在訂單信息被寫入磁盤之前,停電了。這時候當系統重啟后,訂單信息將丟失

MySQL是如何保證持久性的?
MySQL通過"寫前日志"(Write-Ahead-Logging,即WAL)策略,確保了事務的持久性。持久性是指一旦事務完成(即,commit),對數據的修改就是永久性的。即便發生系統崩潰,修改的數據也不會丟失。

具體實現如下:

Redo Log(重做日志): 這是MySQL中最核心的保證持久性的機制。當InnoDB數據庫引擎進行任何改變數據的操作時,首先會把這些操作寫入到內存中的Redo Log Buffer,然后再按照一定頻率(如每秒、事務提交時、buffer滿了等)將這些操作永久的記錄到磁盤的Redo Log中,而不是直接將修改操作寫到磁盤的數據文件。當數據庫異常重啟時,雖然數據文件沒有來得及持久化的更改可能丟失,但是redo log已經記錄了所有改變數據的操作,MySQL可以通過_redo_操作進行數據恢復,以保證數據的持久性。
Binlog(二進制日志): 這是MySQL服務器層的持久性保證機制,在每次事務提交的時候,會把事務的所有操作(包括SQL語句)寫入到Binlog中,同時寫入磁盤保證持久性。在數據主從同步或者數據恢復時,可以重放Binlog中記錄的所有操作。
這兩種機制,尤其是Redo Log,保證了MySQL的持久性,即使在數據庫崩潰后也能通過重播保證不丟失
?

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

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

相關文章

AI基礎:從線性回歸到梯度下降

一個簡單的問題: 如果此時你正站在迷路繚繞的山坡上,能見度不高,但是你又想去往最低的山谷的位置,怎么走? 很簡單,哪里陡那就往那里走唄——而這就是梯度下降算法的思想。 古話說:“先發制于人…

java基于ssm+jsp 電子商城系統

1管理員功能模塊 管理員登錄,通過填寫用戶名、密碼進行登錄,如圖1所示。 圖1管理員登錄界面圖 管理員登錄進入電子商城系統可以查看個人中心、用戶管理、醫生管理、藥品信息管理、線上診療管理、醫生信息管理、管理員管理、論壇管理、系統管理、訂單管…

行業推薦!IG5216量產工具下載,IG5216開卡軟件分享

國內固態硬盤常用,且有量產工具流傳出來的主控廠商包括慧榮、群聯、點序、英韌、得一微、瑞昱、聯蕓、邁威、國科、華瀾微等等。 每個主控需要用各自對應的量產工具,不同的量產工具支持的閃存顆粒也有差異,因此要根據固態硬盤實際的主控型號…

氣膜建筑審批流程及現狀分析—輕空間

氣膜建筑作為一種新興的建筑形式,以其快速建造、成本低廉和靈活多變的優勢在各個領域得到了廣泛應用。然而,氣膜建筑在我國尚未被納入正式的建筑規范,這使得其審批流程與傳統建筑有顯著差異。輕空間將詳細探討氣膜建筑的審批流程及其在實際操…

深入探究 npm cache 命令:用途與實踐指南

npm(Node Package Manager)是 JavaScript 編程語言的包管理器,廣泛用于 Node.js 應用程序。它不僅用于管理項目中的依賴,還提供了一個強大的緩存機制來加速包的安裝過程。npm cache 命令是與 npm 緩存交互的命令行工具&#xff0c…

MongoDB:JSON and BSON

目錄 什么是 JSON MongoDB-JSON連接 什么是 BSON MongoDB 使用 BSON 還是 JSON JSON 與 BSON 架構靈活性和數據治理 JSON 和 BSON 是近親,正如它們幾乎相同的名稱所暗示的那樣JSON(即 JavaScript 對象表示法)是網絡上廣泛流行的數據交換…

grep使用

在 Windows 中,你可以使用以下步驟來使用 grep 命令: 安裝 Git for Windows:grep 命令通常在類 Unix 操作系統(如 Linux、Mac OS X 等)中使用,但你可以通過安裝 Git for Windows 來在 Windows 上獲得類似的…

Transformer 結構

目錄 一、Transformer 的整體結構二、Input Encoding三、Transformer Block3.1 Encoder3.1.1 Attention3.1.2 Self-attention3.1.3 Multi-head Attention 3.2 Decoder3.2.1 Masked Multi-head Attention 四、Transformer 的優缺點 遇到看不明白的地方,歡迎在評論中留…

Incremental Player Build

*未解決,僅作記錄 Unity 版本 2021.3.15f1 問題 Unity 發布webgl 平臺卡在Incremental Player Build 界面。 解決 未找到明確原因,簡化工程路徑后發布成功。

Leetcode 矩陣問題

36題.有效的數獨 此類問題特點是給出行列的多種限定條件,數獨限制每行每列每個小九宮格元素范圍為1-9且不可重復 。解決此類問題最簡單的想法就是使用哈希set,記錄每行,每列,每個小九宮格已經出現的元素。在遍歷矩陣時提前做出是否…

S32K3 --- Wdg(內狗) Mcal配置

前言 看門狗的作用是用來檢測程序是否跑飛,進入死循環。我們需要不停地喂狗,來確保程序是正常運行的,一旦停止喂狗,意味著程序跑飛,超時后就會reset復位程序。 一、Wdg 1.1 WdgGeneral Wdg Disable Allowed : 啟用此參數后,允許在運行的時候禁用看門狗 Wdg Enable User…

技術干貨丨如何加速工業數字孿生應用落地?

什么是數字孿生? “孿生”概念最早可追溯至NASA的阿波羅項目,隨著數字化技術的進步,“孿生”概念應用從物理孿生向數字孿生發展。即“數字孿生”是對資產、進程或系統的一種數字化表示,并通過信息交互、數據同步等方式實現物理實體…

Java校園跑腿小程序校園代買幫忙外賣源碼社區外賣源碼

🔥校園跑腿與外賣源碼揭秘🔥 🚀 引言:為何需要校園跑腿與外賣源碼? 在快節奏的校園生活里,學生們對于便捷、高效的服務需求日益增長。校園跑腿和外賣服務成為了解決這一需求的熱門選擇。然而,…

C++ STL Iterator Adapter

1. std::back_insert_iterator 使用 // back_insert_iterator example #include <iostream> // std::cout #include <iterator> // std::back_insert_iterator #include <vector> // std::vector #include <algorithm> // std::copy…

獲取HTML元素的scrollHeight屬性

獲取HTML元素的scrollHeight屬性 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們將深入探討如何使用JavaScript獲取HTML元素的scrollHeight屬性。scrol…

實時智能全托管-云器Lakehouse重新定義多維數據分析

導讀 本文將分享云器Lakehouse如何重新定義實時多維分析&#xff0c;幫助客戶實現實時、智能、全托管的數據平臺。主要內容包括以下幾大部分&#xff1a; 多維數據分析的發展趨勢和場景解析 技術解析&#xff1a;新一代數平臺Lakehouse如何支持實時分析需求 價值解析&#x…

【打工日常】docker部署一個開源、跨平臺、又低資源運行的監控平臺

一、項目介紹1.項目簡述Netdata是一個開源、跨平臺、又低資源運行的監控平臺。Netdata每秒收集指標,并將它們呈現在漂亮的低延遲儀表板中。它旨在在所有物理和虛擬服務器、云部署、Kubernetes集群和邊緣/IoT設備上運行,以監控您的系統、容器和應用程序。2.項目功能收集數據:…

Matlab中數組詳解

在MATLAB中&#xff0c;數組是最基本的數據類型&#xff0c;幾乎所有的數據運算都涉及數組操作。下面是對MATLAB中數組的詳細解釋和操作示例&#xff1a; 數組的創建 一維數組&#xff08;向量&#xff09;&#xff1a; 行向量&#xff1a;用方括號 [ ] 包含元素&#xff0c;元…

git log 過濾

git log命令主要用于查看Git版本演變歷史&#xff08;也就是提交歷史&#xff09;&#xff0c;同時根據追加的參數和選項不同&#xff0c;也會有不同的展示效果。 git log命令說明 git log官方文檔說明 git log用于查詢版本的歷史&#xff0c;命令形式如下&#xff1a; git…

嵌入式linux系統中面試過程經驗分享

大家好,今天主要給分享一下,如何在面試中介紹自己的項目經驗,希望對大家有所幫助。 在面試時,經過寒暄后,一般面試官會讓介紹項目經驗。常見的問法是,說下你最近的(或最拿得出手的)一個項目。 根據我們的面試經驗,發現有不少候選人對此沒準備,說起來磕磕巴巴,甚…