數據庫事務的四大特性(ACID)

一、前言

在現代數據庫系統中,事務(Transaction)是確保數據一致性和完整性的重要機制。事務的四大特性——原子性(Atomicity)、一致性(Consistency)、隔離性(Isolation)和持久性(Durability),簡稱 ACID,是數據庫事務處理的核心原則。

二、事務的四大特性詳解

1. 原子性(Atomicity)

定義

原子性是指事務中的所有操作要么全部成功執行,要么全部失敗回滾,不存在中間狀態。事務是一個不可分割的最小工作單元。

作用
  • 防止部分操作成功而部分操作失敗導致的數據不一致。
  • 例如,在銀行轉賬場景中,扣款和加款必須同時成功或同時失敗,否則會導致資金丟失或重復。
實現機制
  • 回滾日志(Undo Log):在事務執行前,數據庫會記錄操作的備份數據。如果事務失敗,通過Undo Log將數據恢復到事務開始前的狀態。
  • 原子操作:數據庫引擎通過底層的原子操作(如行鎖)確保事務的不可分割性。
實例分析

假設用戶A向用戶B轉賬100元:

  1. 從A賬戶扣除100元。
  2. 向B賬戶增加100元。
    如果步驟1成功但步驟2失敗,事務會回滾,A和B的賬戶余額都會恢復到原始狀態,避免資金異常。
技術實現
  • InnoDB存儲引擎:通過Undo Log記錄事務修改前的舊版本數據,支持回滾操作。
  • 日志系統:事務執行前,數據庫將操作寫入日志(如Redo Log),確保即使系統崩潰也能恢復。

2. 一致性(Consistency)

定義

一致性要求事務執行前后,數據庫的完整性約束(如主鍵、外鍵、唯一性約束等)始終有效,數據必須從一個一致性狀態轉換到另一個一致性狀態。

作用
  • 確保事務符合業務規則和邏輯。
  • 例如,銀行賬戶的余額不能為負數,轉賬后總金額必須保持不變。
實現機制
  • 數據庫約束:通過主鍵、外鍵、唯一索引等約束條件強制數據完整性。
  • 應用邏輯校驗:在事務中編寫業務規則校驗(如庫存不足時拒絕交易)。
  • 原子性+隔離性:事務的原子性和隔離性共同保障一致性。
實例分析

在電商系統中,用戶下單時需扣除商品庫存:

  1. 檢查庫存是否充足。
  2. 扣除庫存并生成訂單。
    如果庫存不足,事務直接回滾,確保不會出現超賣現象。
技術實現
  • 約束校驗:數據庫在事務提交前進行約束檢查(如外鍵約束、唯一性約束)。
  • 觸發器(Triggers):通過觸發器自動執行業務規則校驗。

3. 隔離性(Isolation)

定義

隔離性要求多個并發事務之間相互隔離,彼此的操作互不干擾,避免并發執行導致的數據不一致問題(如臟讀、不可重復讀、幻讀)。

作用
  • 解決并發事務的干擾問題。
  • 通過不同的隔離級別(如讀已提交、可重復讀、串行化)控制事務的可見性和并發程度。
實現機制
  • 鎖機制:通過行鎖、表鎖等限制并發事務對數據的訪問。
  • 多版本并發控制(MVCC):通過保存數據的多個版本,允許事務讀取一致性快照,避免直接鎖表。
  • 隔離級別
    • 讀未提交(Read Uncommitted):最低級別,允許臟讀。
    • 讀已提交(Read Committed):避免臟讀,但可能出現不可重復讀。
    • 可重復讀(Repeatable Read):避免臟讀和不可重復讀,但可能出現幻讀(MySQL默認級別)。
    • 串行化(Serializable):最高級別,完全隔離,但并發性能最差。
實例分析

假設有兩個并發事務同時修改同一商品的庫存:

  1. 事務1:查詢庫存為100,準備下單。
  2. 事務2:查詢庫存為100,準備下單。
    如果隔離級別過低,可能導致兩個事務都扣減庫存,最終庫存變為0,而實際應剩余50。通過鎖機制或MVCC可以避免此類問題。
技術實現
  • InnoDB存儲引擎:通過鎖(行鎖、間隙鎖)和MVCC實現不同隔離級別的并發控制。
  • Read View:事務開啟時生成一個Read View,記錄當前活躍事務ID列表,通過版本鏈判斷數據可見性。

4. 持久性(Durability)

定義

持久性要求事務一旦提交,對數據庫的修改是永久性的,即使系統崩潰或斷電,數據也不會丟失。

作用
  • 確保事務的提交結果持久化存儲。
  • 例如,轉賬完成后,即使數據庫宕機,賬戶余額的變化仍會被保留。
實現機制
  • 重做日志(Redo Log):事務提交時,數據庫會將操作記錄寫入Redo Log,并持久化到磁盤。即使系統崩潰,恢復時可以通過Redo Log重放事務操作。
  • 磁盤持久化:數據最終會從內存刷新到磁盤,確保物理存儲的可靠性。
實例分析

用戶提交訂單后,數據庫會將訂單信息寫入Redo Log并刷新到磁盤。即使服務器突然斷電,重啟后仍能通過Redo Log恢復訂單數據,避免數據丟失。

技術實現
  • 日志刷盤策略:通過innodb_flush_log_at_trx_commit參數控制Redo Log的刷盤頻率。
  • 雙寫緩沖(Double Write Buffer):防止部分寫失敗導致數據損壞。

三、四大特性之間的關系

特性作用與其他特性的關系
原子性保證操作的完整性和回滾能力是一致性和持久性的基礎
一致性事務的最終目標依賴原子性、隔離性和持久性共同實現
隔離性控制并發事務的干擾通過鎖和MVCC保障一致性
持久性確保數據永久存儲通過Redo Log和磁盤持久化實現

四、實際應用中的權衡

1. 性能與一致性

  • 高隔離級別(如串行化)能完全避免并發問題,但會降低并發性能。
  • 低隔離級別(如讀未提交)性能高,但可能導致臟讀、不可重復讀等問題。

2. 分布式事務

  • 在微服務架構中,單數據庫的ACID特性無法直接滿足跨服務的事務需求,需通過分布式事務方案(如兩階段提交、TCC模式)實現最終一致性。

五、ACID特性在數據庫中的實現

1. MySQL(InnoDB引擎)

  • 原子性:通過Undo Log記錄舊版本數據,支持回滾。
  • 一致性:通過外鍵約束、唯一索引等保障數據完整性。
  • 隔離性:通過MVCC和鎖機制(如行鎖、間隙鎖)實現不同隔離級別。
  • 持久性:通過Redo Log和雙寫緩沖確保數據持久化。

2. PostgreSQL

  • 原子性:通過Write-Ahead Logging(WAL)記錄事務日志。
  • 一致性:通過約束檢查和觸發器保障。
  • 隔離性:基于MVCC實現,支持四種隔離級別。
  • 持久性:通過WAL日志和數據頁刷盤實現。

六、ACID特性的挑戰與優化

1. 并發控制的挑戰

  • 鎖沖突:高并發場景下,鎖競爭可能導致性能下降。
  • 死鎖:事務之間相互等待資源,需通過死鎖檢測和超時機制解決。

2. 性能優化策略

  • 選擇合適的隔離級別:根據業務需求權衡一致性與性能。
  • 減少事務粒度:盡量縮短事務執行時間,減少鎖持有時間。
  • 批量操作:通過批量插入/更新減少事務提交次數。

3. 分布式事務的解決方案

  • 兩階段提交(2PC):協調多個參與者提交或回滾。
  • TCC模式:通過Try-Confirm-Cancel三階段實現最終一致性。
  • Saga模式:通過分解事務為多個本地事務,支持補償機制。

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

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

相關文章

8 種快速易用的Python Matplotlib數據可視化方法

你是否曾經面對一堆復雜的數據,卻不知道如何讓它們變得直觀易懂?別慌,Python 的 Matplotlib 庫是你數據可視化的最佳伙伴!它簡單易用、功能強大,能將枯燥的數字變成引人入勝的圖表。無論是學生、數據分析師還是程序員&…

springboot 控制層調用業務邏輯層,注入報錯,無法自動裝配 解決辦法

報錯: 解決:愿意是業務邏輯層,即service層的具體實現類沒有加注解Service導致的,加上解決了!!

如何提高獨立服務器的安全性?

獨立服務器相對于其它服務器來說,整體的硬件設備都是獨立的同時還有著強大的服務器性能,其中CPU設備能夠決定著服務器的運算能力,所以獨立服務器的安全性受到企業格外的重視,嚴重的話會給企業造成巨大的資金損失。 那么&#xff0…

關于 Web 風險點原理與利用:6. 邏輯風險點

一、分類: 1.1 越權訪問 **越權訪問(Authorization Bypass)**是指:攻擊者繞過了權限控制機制,訪問或操作了非其權限范圍內的資源或功能。 換句話說,系統該攔你沒攔,你就越權成功了。 1.1.1 …

分布式緩存:ZSET → MGET 跨槽(cross‐slot)/ 并發 GET解決思路

文章目錄 緩存全景圖Pre問題描述解決思路一、管道(Pipelining)替代多線程二、使用 Hash Tag 保證數據同槽三、用 Hash 結構一次性批量取值四、把數據直接存進 ZSET(或用 RedisJSON) 小結 緩存全景圖 Pre 分布式緩存:緩…

開發AR導航助手:ARKit+Unity+Mapbox全流程實戰教程

引言 在增強現實技術飛速發展的今天,AR導航應用正逐步改變人們的出行方式。本文將手把手教你使用UnityARKitMapbox開發跨平臺AR導航助手,實現從虛擬路徑疊加到空間感知的完整技術閉環。通過本教程,你將掌握: AR空間映射與場景理…

助力 FPGA 國產化,ALINX 攜多款方案亮相深圳、廣州“紫光同創 FPGA 技術研討會”

5 月中旬,一年一度的紫光同創技術研討會系列活動正式拉開帷幕,相繼在深圳、廣州帶來 FPGA 技術交流盛宴。 ALINX 作為紫光同創官方合作伙伴,長期助力推動 FPGA 國產化應用發展,此次攜多款基于 Kosmo-2 系列產品開發的方案 demo 亮…

LeetCode 1040.移動石子直到連續II

在 X 軸上有一些不同位置的石子。給定一個整數數組 stones 表示石子的位置。 如果一個石子在最小或最大的位置,稱其為 端點石子。每個回合,你可以將一顆 端點石子 拿起并移動到一個未占用的位置,使得該石子不再是一顆 端點石子。 值得注意的…

梯度優化提示詞:精準引導AI分類

基于梯度優化的提示詞工程方法,通過迭代調整提示詞的嵌入向量,使其能夠更有效地引導模型做出正確分類。 數據形式 訓練數據 train_data 是一個列表,每個元素是一個字典,包含兩個鍵: text: 需要分類的文本描述label: 對應的標簽(“沖動"或"理性”)示例數據: …

JavaWeb:SpringBoot配置優先級詳解

3種配置 打包插件 命令行 優先級 SpringBoot的配置優先級決定了不同配置源之間的覆蓋關系,遵循高優先級配置覆蓋低優先級的原則。以下是詳細的優先級排序及配置方法說明: 一、配置優先級從高到低排序 1.命令行參數 優先級最高,通過keyvalu…

使用CentOS部署本地DeekSeek

一、查看服務器的操作系統版本 cat /etc/centos-release二、下載并安裝ollama 1、ollama下載地址: Releases ollama/ollama GitHubGet up and running with Llama 3.3, DeepSeek-R1, Phi-4, Gemma 3, Mistral Small 3.1 and other large language models. - Re…

Matplotlib 后端與事件循環

前言:很多時候,matplot跑出來的是這種靜態非交互的,如果想要可以交互,就得設定一個后端,例如 matplotlib.use(TkAgg)Matplotlib 后端 (Backend) Matplotlib 的設計理念是能夠以多種方式輸出圖形,無論是顯…

【JAVA】中文我該怎么排序?

📘 Java 中文排序教學文檔(基于 Collator) 🧠 目錄 概述Java 中字符串排序的默認行為為什么需要 Collator使用 Collator 進行中文排序升序 vs 降序排序自定義對象字段排序多字段排序示例總結對比表附錄:完整代碼示例 …

k8s-NetworkPolicy

在 Kubernetes 中,NetworkPolicy 是一種資源對象,用于定義 Pod 之間的網絡通信策略。它允許你控制哪些 Pod 可以相互通信,以及如何通信。通過使用 NetworkPolicy,可以實現更細粒度的網絡訪問控制,增強集群的安全性。 1…

LAN(局域網)和WAN(廣域網)

你的問題非常清晰!我來用一個直觀的比喻實際拓撲圖幫你徹底理解LAN(局域網)和WAN(廣域網)如何協同工作,以及路由器在其中的位置。你可以把整個網絡想象成一座城市: 1. 比喻:城市交通…

idea 插件開發自動發布到 nexus 私服中(腳本實例)

如下腳本內容為 idea 插件開發項目中的 build.gradle.kts 文件示例,其中自定了 updatePluginsXmlToNexus 和 uploadPluginToNexus 兩個任務,一個用來自動修改 nexus 中的配置文件,一個用來自動將當前插件打包后的 zip 文件上傳到 nexus 私服中…

SpringBoot-11-基于注解和XML方式的SpringBoot應用場景對比

文章目錄 1 基于注解的方式1.1 @Mapper1.2 @select1.3 @insert1.4 @update1.5 @delete2 基于XML的方式2.1 namespace2.2 resultMap2.3 select2.4 insert2.5 update2.6 delete3 service和controller3.1 service3.2 controller4 注解和xml的選擇如果SQL簡單且項目規模較小,推薦使…

C++復習核心精華

一、內存管理與智能指針 內存管理是C區別于其他高級語言的關鍵特性,掌握好它就掌握了C的靈魂。 1. 原始指針與內存泄漏 先來看看傳統C的內存管理方式: void oldWay() {int* p new int(42); // 分配內存// 如果這里發生異常或提前return&#xff0c…

期貨反向跟單軟件—提高盤手杠桿的方式及剖析

在期貨反向跟單領域,期貨跟單軟件對盤手杠桿的調節,是整個策略運作的核心環節之一。其背后蘊含著科學的金融邏輯。? 期貨跟單軟件提高盤手杠桿主要通過兩種方式。第一種是降低期貨保證金。在盤手資金總量固定的情況下,保證金降低&#xff0…

【計算機網絡】基于UDP進行socket編程——實現服務端與客戶端業務

🔥個人主頁🔥:孤寂大仙V 🌈收錄專欄🌈:Linux 🌹往期回顧🌹: 【Linux筆記】——網絡基礎 🔖流水不爭,爭的是滔滔不息 一、UDPsocket編程UDPsocket編…