【分布式理論11】分布式協同之分布式事務(一個應用操作多個資源):從剛性事務到柔性事務的演進

文章目錄

    • 一. 什么是分布式事務?
    • 二. 分布式事務的挑戰
    • 三. 事務的ACID特性
    • 四. CAP理論與BASE理論
      • 1. CAP理論
        • 1.1. 三大特性
        • 1.2. 三者不能兼得
      • 2. BASE理論
    • 五. 分布式事務解決方案
      • 1. 兩階段提交(2PC)
      • 2. TCC(Try-Confirm-Cancel)
    • 六. 小結

之前我們了解分布式系統中的互斥問題及其解決方案(分布式鎖)。互斥問題討論的是多個進程對同一個臨界資源進行操作的問題,而本文將要討論的是同一個進程對多個臨界資源進行操作的問題。

一. 什么是分布式事務?

簡單來說,分布式事務就是跨多個獨立的資源(比如數據庫)進行的事務。

舉個例子,假設一個銀行系統需要處理一次轉賬操作:從A賬戶轉出100元分別到B賬戶30元、C賬戶70元。這種操作不僅僅涉及到一個數據庫,而是涉及多個資源(A賬戶、B賬戶、C賬戶)。這個轉賬操作要么完全成功,所有的賬戶變動都要完成;要么完全失敗,沒有任何賬戶被修改。類似這樣的跨多個資源的事務,我們稱之為分布式事務。

?

二. 分布式事務的挑戰

在分布式系統中,跨多個服務和數據庫執行的事務面臨以下幾個挑戰:

  • 一致性問題:如何保證數據在多個系統中保持一致?
  • 網絡故障:網絡不穩定可能導致事務執行失敗,如何保證事務不會中途丟失或被錯誤提交?
  • 并發沖突:多個服務之間并發執行的事務如何互不干擾?

為了處理這些挑戰,分布式事務采用了不同的理論和技術框架來確保數據一致性、可用性和事務的正確性。

?

三. 事務的ACID特性

分布式事務的核心目標是保證事務的一致性和完整性,這與單體應用中的ACID特性密切相關。ACID是事務管理的基本要求,包含以下四個特性:

  • 原子性(Atomicity):事務中的所有操作要么全部成功,要么全部失敗,不能部分成功。
  • 一致性(Consistency):事務執行前后的數據一致,系統從一個一致性狀態轉變到另一個一致性狀態。比如:從 A 賬戶轉出 100元,B 賬戶中到賬 30 元,C 賬戶中到賬 70 元。完成這個事務操作以后,A 賬戶減少的錢數與 B、C 賬戶增加的錢數總和應該是一樣的,都是 100 元。
  • 隔離性(Isolation):并發執行的事務互不干擾,每個事務對外界是隔離的。
  • 持久性(Durability):一旦事務提交,數據更改就會永久保存,即使系統崩潰也不丟失。

在單體架構中,ACID特性易于實現,但在分布式系統中,由于網絡延遲、節點故障等問題,保證強一致性變得困難。此時,我們需要更靈活的解決方案。

?

四. CAP理論與BASE理論

1. CAP理論

1.1. 三大特性

在分布式系統中,由于網絡和硬件的限制,無法同時保證一致性可用性分區容錯性,這就是著名的CAP理論的核心思想。CAP理論提出,在一個分布式系統中,最多只能保證以下兩個特性:

  • 一致性(Consistency):所有節點的視圖是相同的,保證每個節點的數據在同一時刻一致。
    在這里插入圖片描述

  • 可用性(Availability):可用性是指在分布式系統中,即使一部分節點出現故障,系統仍然可以響應用戶的請求。

在這里插入圖片描述

  • 分區容錯性(Partition tolerance):假設兩個數據庫節點(每個節點數據一致)分布在兩個區,而這兩個區的通信發生了問題,因此無法達成數據一致,這就是分區問題,此時需要從一致性和可用性之間做出選擇。是選擇一致性(C)?,等待兩個區的數據同步了再去獲取數據,還是選擇可用性(A)?,只獲取其中一個區的數據?

在這里插入圖片描述

?

1.2. 三者不能兼得

CAP理論表明,當網絡分區發生時,分布式系統必須在一致性和可用性之間做出選擇。如下例子:

業務代碼對兩個節點的通信失敗,往數據庫 01 寫入記錄 A 時,需要鎖住數據庫02 中的記錄 A,不讓其他業務代碼修改此紀錄,直到數據庫 01 修改完成。一致性和可用性在此刻是矛盾的,不能兼得。

保證特性放棄特性適用場景說明
一致性、可用性分區容錯性不適用(無法實現)如果放棄分區容錯性,就等于放棄使用分布式系統,即單體。
一致性、分區容錯性可用性金融領域(如銀行、支付系統等)需要保證數據一致性,甚至在網絡分區時也要犧牲系統可用性,保證交易數據的正確性和一致性。
可用性、分區容錯性一致性ToC端應用(如電商網站、社交平臺等)強調用戶體驗,犧牲部分一致性以換取系統高可用性,允許數據暫時不一致。適合大流量和高并發的應用場景。

?

2. BASE理論

由于 CAP 理論導致一個應用同時至多只能支持兩個特性,無法三全其美,且高并發系統追求的往往是可用性,因此對 CAP 理論進行進一步擴充,產生了 BASE 理論。

特性說明舉例
基本可用性系統能夠在流量激增或節點故障時,通過限流或降級保證用戶請求可用。電商系統在流量激增時,優先保證核心業務(如訂單處理),將非核心業務降級處理。
軟狀態數據副本之間允許存在短時間的數據不一致,容忍數據同步延遲。數據庫01中記錄A寫入后,數據庫02中的記錄B會在一定延遲后同步,而不是立即同步。
最終一致性數據在短時間內可能不一致,但過了一段時間后,數據會最終達到一致。在分布式系統中,數據副本可能會在網絡延遲時出現不一致,但經過一段時間,數據會同步一致。

BASE理論強調的是最終一致性,而不是傳統數據庫中的強一致性。它適用于那些需要高可用性和容忍短期不一致的系統,例如電商平臺和社交網絡

?

五. 分布式事務解決方案

為了在分布式系統中保證事務的正確性,業界提出了多種分布式事務解決方案,常見的有兩階段提交(2PC)TCC(Try、Confirm、Cancel)

1. 兩階段提交(2PC)

**兩階段提交協議(2PC)的基本思想是通過協調者(Transaction Manager)和參與者(Resource Manager)來控制事務的提交或回滾。2PC的工作過程分為兩個階段:

?

準備階段

事務協調者(事務管理器)詢問每個參與者是否準備好,馬上要執行事務了。事務參與者會根據自身業務和資源情況進行檢查,然后給出反饋。

檢查過程根據業務內容的不同而不同,例如訂票業務需要檢查是否有剩余票、扣款業務需要檢查余額是否足夠。只有檢查通過,才能返回就緒(ready)信息。否則,事務將終止,并且等待下次詢問。由于檢查過程需要完成一些操作,因此需要寫 redo 日志和 undo 日志,以便事務失敗重試,或者失敗回滾時使用。

在這里插入圖片描述

?

提交階段
如下圖:如果事務協調者接收到事務參與者檢查失敗或者超時的消息,會給其發送回滾(rollback)消息,否則發送提交(commit)消息。
在這里插入圖片描述

以下是整理后的兩種情況的處理過程:

情況步驟
情況 1:事務回滾條件:只要有一個事務參與者反饋未就緒(no ready),事務協調者會回滾事務。
1. 事務協調者向所有事務參與者發出回滾請求。
2. 事務參與者使用第一階段的 undo 日志信息執行回滾操作,并釋放事務期間占用的資源。
3. 各事務參與者向事務協調者反饋應答(ack)消息,表示完成回滾操作。
4. 事務協調者接收到所有事務參與者的應答消息,即完成事務回滾。
情況 2:事務提交條件:當所有事務參與者均反饋就緒(ready)消息時,事務協調者會提交事務。
1. 事務協調者向所有事務參與者發出正式提交事務的請求。
2. 事務參與者執行提交(commit)操作,并釋放事務期間占用的資源。
3. 各事務參與者向事務協調者反饋應答(ack)消息,表示完成提交操作。
4. 事務協調者接收到所有事務參與者的應答(ack)消息,即完成事務提交。

盡管2PC簡單易理解,但它存在問題,比如在網絡分區或故障情況下,可能會導致事務掛起,無法繼續提交或回滾,造成數據不一致。

?

2. TCC(Try-Confirm-Cancel)

TCC(Try-Confirm-Cancel)的核心思想是對于每個資源的原子操作,應用程序都需要注冊一個與此操作對應的確認操作和補償(撤銷)操作。其中確認操作負責在原子操作執行成功時進行事務提交,補償操作負責在原子操作執行失敗時對事務進行回滾。

?

TCC協議分為三個階段:

  • Try階段:進行資源的預檢查和預留,確保資源可用。
  • Confirm階段:負責對業務系統做確認提交。如果 Try 階段執行成功,表明針對資源的操作已經準備就緒,此時執行 Confirm 便會提交對資源的操作。也就是說當資源準備好時,只用提交該操作執行就好了。
  • Cancel階段:負責在業務執行錯誤,需要回滾時執行業務取消操作,此時就需要釋放 Try 階段預留的資源了。換句話說,是在資源操作執行失敗的情況下,根據之前預留的資源情況進行回滾

?

TCC協議通過提供靈活的補償機制,能夠在事務失敗時進行回滾,保證系統的一致性。

例子:
假設有一個轉賬服務,需要把 A 銀行中 A 賬戶的 100 元分別轉到 B 銀行的 B 賬戶和 C 銀行的 C 賬戶,這三個銀行的轉賬服務各不相同,因此這次轉賬服務就形成了一次分布式事務。

階段操作描述具體步驟
Try 階段檢測資源是否可用,驗證所有參與者的資源可用性,并記錄相關信息。1. 檢查 A 賬戶余額是否大于 100 元。
2.記錄 A 賬戶的總金額、轉出金額。
3. 記錄 B、C 賬戶的總金額、轉入金額。
4. 在數據庫中保存相關字段(如余額、轉出金額)。
5. 如果資源可用,進入 Confirm 階段;如果不可用,回滾。
Confirm 階段執行具體的轉賬邏輯,進行資源更新,并設置事務的成功狀態。1. 從 A 賬戶扣除 100 元,更新余額為 220 - 100 = 120
2. 更新 B 賬戶余額為 50 + 30 = 80,C 賬戶余額為 60 + 70 = 130
3. 更新交易狀態為轉賬成功。
4. 向所有參與者發出確認提交請求,確認各方操作。
Cancel 階段回滾操作,恢復資源到原始狀態。1. 如果 Try 階段失敗或資源無法提供,回滾所有操作。
2. A 賬戶恢復扣除的 100 元,余額為 120 + 100 = 220
3. B 賬戶和 C 賬戶分別恢復相應的金額,B 賬戶恢復為 80 - 30 = 50,C 賬戶恢復為 130 - 70 = 60
4. 事務回滾并釋放占用的資源。

?

六. 小結

分布式事務的出現帶來了很多挑戰,但也推動了事務管理理論和實踐的不斷發展。從ACID特性到CAP理論、BASE理論,再到DTP、2PC和TCC等分布式事務協議,每一種理論和方案都在不同的應用場景中發揮著重要作用。

在實際開發中,選擇哪種分布式事務方案應根據業務需求、系統架構、性能要求等因素來決定。對于高一致性要求的金融類系統,2PC可能更合適;而對于電商類高并發系統,TCC和BASE理論的結合則能提供更高的可用性和靈活性。

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

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

相關文章

【Quest開發】全身跟蹤

軟件:Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件:Meta Quest3 最終效果:能像meta的操作室沉浸場景一樣根據頭盔移動來推斷用戶姿勢,實現走路、蹲下、手勢匹配等功能 需要借助UnityMovement這個包 GitHub …

AI全棧開發_人工智能AI大模型 Prompt提示詞工程詳解(全方位介紹及運用)

AI引領的第四次工業革命正席卷而來,如何精準把握這一歷史性的機遇,將成為我們這一代人不容忽視且需深入思考與積極行動的重要課題。未來幾年AI將會像計算機一樣快速普及,面對這一歷史性的第一波紅利,你是否已準備好把握機遇&#…

小米平板怎么和電腦共享屏幕

最近嘗試使用小米平板和電腦屏幕分屏互聯 發現是需要做特殊處理的,需要下載一款電腦安裝包:小米妙享 關于這個安裝包,想吐槽的是: 沒有找到官網渠道,是通過其他網絡方式查到下載的 不附錄鏈接,原因是因為地…

java | MyBatis-plus映射和golang映射對比

文章目錄 Java實體類和數據庫的映射1.默認駝峰命名規則2.自定義字段映射3.關閉駝峰命名規則4.JSON序列化映射 Golang1. 結構體與表的映射2. 字段與列的映射3. 關聯關系映射4. 其他映射相關標簽 這篇也是做數據庫映射方面的對比: Java 實體類和數據庫的映射 1.默認…

訊方·智匯云校華為官方授權培訓機構

1.官方授權 訊方智匯云校是華為領先級授權培訓機構(華為授權培訓合作伙伴(HALP)體系,分為認證、優選、領先三個等級,領先級是HALP最高級),代表著華為對培訓合作伙伴在專業能力、師資隊伍、合作…

避免踩雷!CUDA與Anaconda兼容性配置完全手冊

CUDA與Anaconda深度學習環境配置指南 目錄 核心概念解析安裝場景分析版本沖突處理最佳實踐指南常見問題解答 核心概念解析 1. 組件對比表 組件作用域包含內容查看方式NVIDIA驅動系統級GPU底層通信支持nvidia-smiCUDA Toolkit系統級完整開發工具鏈(nvcc等)nvcc --versioncon…

掌握.NET Core后端發布流程,如何部署后端應用?

無論你是剛接觸.NET Core的新手還是已有經驗的開發者,在這篇文章中你將會學習到一系列實用的發布技巧與最佳實踐,幫助你高效順利地將.NET Core后端應用部署到生產環境中 目錄 程序發布操作 Docker容器注冊表 文件夾發布 導入配置文件 網站運行操作 …

一周學會Flask3 Python Web開發-request請求對象與url傳參

鋒哥原創的Flask3 Python Web開發 Flask3視頻教程: 2025版 Flask3 Python web開發 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili request請求對象封裝了從客戶端發來的請求報文信息,我們可以從中獲取所有數據。 request對象包含的常用屬性&…

2025年2月深度實測!DeepSeek、OpenAI o1、Gemini打造爆款應用及對比

我在網上看到了關于DeepSeek R1的各種說法,這是一個開源模型,其能力即便不比OpenAI o1等付費模型強,也與之相當: 由于我在日常工作中廣泛使用這些人工智能模型(使用Cursor AI),我決定看看哪種模型最適合我。 在進行了200次Cursor請求后,我將分享我的實驗結果。 一、…

OpenCV機器學習(6)樸素貝葉斯分類器(Naive Bayes Classifier)cv::ml::NormalBayesClassifier的使用

操作系統:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 編程語言:C11 算法描述 cv::ml::NormalBayesClassifier 是 OpenCV 機器學習模塊中的一部分,用于實現樸素貝葉斯分類器(Naive Bayes Classifier&a…

LLaVA-CoT: Let Vision Language Models Reason Step-by-Step論文解讀

文章目錄 前言一、摘要一、引言二、文獻綜述1. Visual reasoning with large language models2. Chain-of-thought in large language models3. Inference time scaling 三、方法1. Enhancing Reasoning Capability through Structured Thinking1. Reasoning Stages2. Data Pre…

Linux 和 Windows 區別

1. 文件組織 (1)目錄結構 Linux:采用**單一根目錄(/)**結構,所有文件和設備都掛載在這個目錄下。 典型目錄: /home/(用戶目錄)/etc/(配置文件)/bin/(系統可執行文件)/dev/(設備文件)/mnt/(掛載點)Windows:采用多個驅動器(C:\, D:\),每個分區是一個獨立的…

java基礎語知識(8)

類之間的關系 在類之間,最常見的關系有: 依賴(“uses-a”);聚合(“has-a”);繼承(“is-a”)。 依賴:一種使用關系,即一個類的實現需要另一個類的協助&#x…

Linux系統中常見的詞GNU是什么意思?

GNU 是 “GNU’s Not Unix” 的遞歸縮寫,它是一個自由軟件項目,旨在創建一個完全自由的操作系統。這個名字反映了GNU項目的核心理念:它試圖創建一個類Unix的系統,但不是Unix本身。 GNU 項目由 理查德斯托曼(Richard S…

安卓burp抓包,bypass ssl pinning

好久好久沒有發東西了。主要是懶。。。 這幾天在搞apk滲透,遇到了burp無法抓包問題,覺得可以寫下來。 問題描述 1. 一臺安卓手機,裝了面具,可以拿到root 2. 電腦上有burp,設置代理 3.手機和電腦連同一個網段&…

抖音試水AI分身;騰訊 AI 戰略調整架構;百度旗下小度官宣接入DeepSeek...|網易數智日報

抖音試水AI分身,字節旗下AI智能體平臺扣子已與抖音打通,相關功能內測中 2月19日消息,鈦媒體App獨家獲悉,字節旗下AI智能體開發平臺扣子(Coze)已與抖音打通,抖音創作者可在扣子智能體平臺打造AI分…

Python爬蟲實戰:爬取豆瓣電影

目錄 引言 1. 爬蟲基礎 1.1 什么是爬蟲? 1.2 Python爬蟲常用庫 2. 實戰:抓取豆瓣電影Top250 2.1 安裝依賴庫 2.2 發送HTTP請求 ?編輯 2.3 解析HTML ?編輯 2.4 存儲數據 2.5 完整代碼 3. 進階:處理分頁和動態內容 3.1 抓取多頁…

請談談 Vue 中的響應式原理,如何實現?

一、Vue2響應式原理:Object.defineProperty的利與弊 實現原理: // 數據劫持核心實現 function defineReactive(obj, key, val) {const dep new Dep(); // 依賴收集容器Object.defineProperty(obj, key, {get() {if (Dep.target) { // 當前Watcher實例…

第6章:基于LangChain如何開發Agents,附帶客戶支持智能體示例

本文主要介紹了 LangChain4j 中的 Agent(代理) 概念,以及如何使用 LangChain4j 構建代理系統,重點提供了一個客戶支持系統的智能體樣例 代理(Agents)| LangChain4j 注意: 請注意,“A…

Android 中使用 FFmpeg 進行音視頻處理

1. FFmpeg 基礎知識 1.1 什么是 FFmpeg? FFmpeg 是一個開源的多媒體處理工具,支持音視頻的編碼、解碼、轉碼、裁剪、合并、濾鏡、流媒體等功能。它是一個命令行工具,支持多種音視頻格式和編解碼器。1.2 為什么在 Android 中使用 FFmpeg? Android 自帶的多媒體 API(如 Med…