在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

后端程序員必備:分布式事務基礎篇

jf_ro2CN3Fa ? 來源:撿田螺的小男孩 ? 2023-08-31 16:00 ? 次閱讀


前言

最近看了幾篇有關于分布式事務的博文,做一下筆記。哈哈~

2f1aa13e-47c2-11ee-97a6-92fbcf53809c.png

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

數據庫事務

數據庫事務(簡稱:事務 ),是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成,這些操作要么全部執行,要么全部不執 行,是一個不可分割 的工作單位。

數據庫事務的幾個典型特性:原子性(Atomicity )、一致性( Consistency )、隔離性( Isolation)和持久性(Durabilily),簡稱就是ACID。

2f3173c8-47c2-11ee-97a6-92fbcf53809c.png
  • 原子性: 事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
  • 一致性: 指在事務開始之前和事務結束以后,數據不會被破壞,假如A賬戶給B賬戶轉10塊錢,不管成功與否,A和B的總金額是不變的。
  • 隔離性: 多個事務并發訪問時,事務之間是相互隔離的,即一個事務不影響其它事務運行效果。簡言之,就是事務之間是進水不犯河水的。
  • 持久性: 表示事務完成以后,該事務對數據庫所作的操作更改,將持久地保存在數據庫之中。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

事務的實現原理

本地事務

傳統的單服務器,單關系型數據庫下的事務,就是本地事務。本地事務由資源管理器管理,JDBC事務就是一個非常典型的本地事務。2f563a1e-47c2-11ee-97a6-92fbcf53809c.png

事務日志

innodb事務日志包括redo log和undo log。

redo log(重做日志)

redo log通常是物理日志,記錄的是數據頁的物理修改,而不是某一行或某幾行修改成怎樣,它用來恢復提交后的物理數據頁。

undo log(回滾日志)

undo log是邏輯日志,和redo log記錄物理日志的不一樣。可以這樣認為,當delete一條記錄時,undo log中會記錄一條對應的insert記錄,當update一條記錄時,它記錄一條對應相反的update記錄。

事務ACID特性的實現思想

  • 原子性:是使用 undo log來實現的,如果事務執行過程中出錯或者用戶執行了rollback,系統通過undo log日志返回事務開始的狀態。
  • 持久性:使用 redo log來實現,只要redo log日志持久化了,當系統崩潰,即可通過redo log把數據恢復。
  • 隔離性:通過鎖以及MVCC,使事務相互隔離開。
  • 一致性:通過回滾、恢復,以及并發情況下的隔離性,從而實現一致性。

分布式事務

分布式事務: 就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位于不同的分布式系統的不同節點之上。簡單來說,分布式事務指的就是分布式系統中的事務,它的存在就是為了保證不同數據庫節點的數據一致性。

為什么需要分布式事務?接下來分兩方面闡述:

微服務架構下的分布式事務

隨著互聯網的快速發展,輕盈且功能劃分明確的微服務,登上了歷史舞臺。比如,一個用戶下訂單,購買直播禮物的服務,被拆分成三個service,分別是金幣服務(coinService),下訂單服務(orderService)、禮物服務(giftService)。這些服務都部署在不同的機器上(節點),對應的數據庫(金幣數據庫、訂單數據庫、禮物數據庫)也在不同節點上。

2f6d193c-47c2-11ee-97a6-92fbcf53809c.png

用戶下單購買禮物,禮物數據庫、金幣數據庫、訂單數據庫在不同節點上,用本地事務是不可以的,那么如何保證不同數據庫(節點)上的數據一致性呢?這就需要分布式事務啦~

分庫分表下的分布式事務

隨著業務的發展,數據庫的數據日益龐大,超過千萬級別的數據,我們就需要對它分庫分表(以前公司是用mycat分庫分表,后來用sharding-jdbc)。一分庫,數據又分布在不同節點上啦,比如有的在深圳機房,有的在北京機房~你再想用本地事務去保證,已經無動于衷啦~還是需要分布式事務啦。

比如A轉10塊給B,A的賬戶數據是在北京機房,B的賬戶數據是在深圳機房。流程如下:

2f89d400-47c2-11ee-97a6-92fbcf53809c.png

CAP 理論&BASE 理論

學習分布式事務,當然需要了解 CAP 理論和BASE 理論。

CAP理論

CAP理論作為分布式系統的基礎理論,指的是在一個分布式系統中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區容錯性),這三個要素最多只能同時實現兩點。2f9fd322-47c2-11ee-97a6-92fbcf53809c.png

一致性(C:Consistency):

一致性是指數據在多個副本之間能否保持一致的特性。例如一個數據在某個分區節點更新之后,在其他分區節點讀出來的數據也是更新之后的數據。

可用性(A:Availability):

可用性是指系統提供的服務必須一直處于可用的狀態,對于用戶的每一個操作請求總是能夠在有限的時間內返回結果。這里的重點是"有限時間內"和"返回結果"。

分區容錯性(P:Partition tolerance):

分布式系統在遇到任何網絡分區故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務。

選擇 說明
CA 放棄分區容錯性,加強一致性和可用性,其實就是傳統的單機數據庫的選擇
AP 放棄一致性,分區容錯性和可用性,這是很多分布式系統設計時的選擇
CP 放棄可用性,追求一致性和分區容錯性,網絡問題會直接讓整個系統不可用

BASE 理論

BASE 理論, 是對CAP中AP的一個擴展,對于我們的業務系統,我們考慮犧牲一致性來換取系統的可用性和分區容錯性。BASE是Basically Available(基本可用),Soft state(軟狀態),和 Eventually consistent(最終一致性)三個短語的縮寫。

Basically Available

基本可用:通過支持局部故障而不是系統全局故障來實現的。如將用戶分區在 5 個數據庫服務器上,一個用戶數據庫的故障只影響這臺特定主機那 20% 的用戶,其他用戶不受影響。

Soft State

軟狀態,狀態可以有一段時間不同步

Eventually Consistent

最終一致,最終數據是一致的就可以了,而不是時時保持強一致。

分布式事務的幾種解決方案

分布式事務解決方案主要有以下這幾種:

  • 2PC(二階段提交)方案
  • TCC(Try、Confirm、Cancel)
  • 本地消息表
  • 最大努力通知
  • Saga事務

二階段提交方案

二階段提交方案是常用的分布式事務解決方案。事務的提交分為兩個階段:準備階段和提交執行方案。

二階段提交成功的情況

準備階段 ,事務管理器向每個資源管理器發送準備消息,如果資源管理器的本地事務操作執行成功,則返回成功。

提交執行階段 ,如果事務管理器收到了所有資源管理器回復的成功消息,則向每個資源管理器發送提交消息,RM 根據 TM 的指令執行提交。如圖:

2fc8e488-47c2-11ee-97a6-92fbcf53809c.jpg
二階段提交失敗的情況

準備階段 ,事務管理器向每個資源管理器發送準備消息,如果資源管理器的本地事務操作執行成功,則返回成功,如果執行失敗,則返回失敗。

提交執行階段 ,如果事務管理器收到了任何一個資源管理器失敗的消息,則向每個資源管理器發送回滾消息。資源管理器根據事務管理器的指令回滾本地事務操作,釋放所有事務處理過程中使用的鎖資源。

2fec44e6-47c2-11ee-97a6-92fbcf53809c.jpg
二階段提交優缺點

2PC方案實現起來簡單,成本較低,但是主要有以下缺點

  • 單點問題:如果事務管理器出現故障,資源管理器將一直處于鎖定狀態。
  • 性能問題:所有資源管理器在事務提交階段處于同步阻塞狀態,占用系統資源,一直到提交完成,才釋放資源,容易導致性能瓶頸。
  • 數據一致性問題:如果有的資源管理器收到提交的消息,有的沒收到,那么會導致數據不一致問題。

TCC(補償機制)

TCC 采用了補償機制,其核心思想是:針對每個操作,都要注冊一個與其對應的確認和補償(撤銷)操作。

TCC(Try-Confirm-Cancel)模型

TCC(Try-Confirm-Cancel)是通過對業務邏輯的分解來實現分布式事務。針對一個具體的業務服務,TCC 分布式事務模型需要業務系統都實現一下三段邏輯:

try階段 :嘗試去執行,完成所有業務的一致性檢查,預留必須的業務資源。

Confirm階段 :該階段對業務進行確認提交,不做任何檢查,因為try階段已經檢查過了,默認Confirm階段是不會出錯的。

Cancel 階段 :若業務執行失敗,則進入該階段,它會釋放try階段占用的所有業務資源,并回滾Confirm階段執行的所有操作。

3003204e-47c2-11ee-97a6-92fbcf53809c.jpg

TCC 分布式事務模型包括三部分:主業務服務、從業務服務、業務活動管理器 。

  • 主業務服務:主業務服務負責發起并完成整個業務活動。
  • 從業務服務:從業務服務是整個業務活動的參與方,實現Try、Confirm、Cancel操作,供主業務服務調用。
  • 業務活動管理器:業務活動管理器管理控制整個業務活動,包括記錄事務狀態,調用從業務服務的 Confirm 操作,調用從業務服務的 Cancel 操作等。

下面再拿用戶下單購買禮物作為例子來模擬TCC實現分布式事務的過程:

假設用戶A余額為100金幣,擁有的禮物為5朵。A花了10個金幣,下訂單,購買10朵玫瑰。余額、訂單、禮物都在不同數據庫。

TCC的Try階段:

  • 生成一條訂單記錄,訂單狀態為待確認。
  • 將用戶A的賬戶金幣中余額更新為90,凍結金幣為10(預留業務資源)
  • 將用戶的禮物數量為5,預增加數量為10。
  • Try成功之后,便進入Confirm階段
  • Try過程發生任何異常,均進入Cancel階段
30248da6-47c2-11ee-97a6-92fbcf53809c.jpg

TCC的Confirm階段:

  • 訂單狀態更新為已支付
  • 更新用戶余額為90,可凍結為0
  • 用戶禮物數量更新為15,預增加為0
  • Confirm過程發生任何異常,均進入Cancel階段
  • Confirm過程執行成功,則該事務結束

3044be0a-47c2-11ee-97a6-92fbcf53809c.jpgTCC的Cancel階段:

  • 修改訂單狀態為已取消
  • 更新用戶余額回100
  • 更新用戶禮物數量為5
305f54ea-47c2-11ee-97a6-92fbcf53809c.jpg
TCC優缺點

TCC方案讓應用可以自定義數據庫操作的粒度,降低了鎖沖突,可以提升性能,但是也有以下缺點:

  • 應用侵入性強,try、confirm、cancel三個階段都需要業務邏輯實現。
  • 需要根據網絡、系統故障等不同失敗原因實現不同的回滾策略,實現難度大,一般借助TCC開源框架,ByteTCC,TCC-transaction,Himly。

本地消息表

ebay最初提出本地消息表這個方案,來解決分布式事務問題。業界目前使用這種方案是比較多的,它的核心思想就是將分布式事務拆分成本地事務進行處理。可以看一下基本的實現流程圖:

307a7e00-47c2-11ee-97a6-92fbcf53809c.jpg
基本實現思路

發送消息方:

  • 需要有一個消息表,記錄著消息狀態相關信息。
  • 業務數據和消息表在同一個數據庫,即要保證它倆在同一個本地事務。
  • 在本地事務中處理完業務數據和寫消息表操作后,通過寫消息到MQ消息隊列。
  • 消息會發到消息消費方,如果發送失敗,即進行重試。

消息消費方:

  • 處理消息隊列中的消息,完成自己的業務邏輯。
  • 此時如果本地事務處理成功,則表明已經處理成功了。
  • 如果本地事務處理失敗,那么就會重試執行。
  • 如果是業務上面的失敗,給消息生產方發送一個業務補償消息,通知進行回滾等操作。

生產方和消費方定時掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發送一遍。如果有靠譜的自動對賬補賬邏輯,這種方案還是非常實用的。

優點&缺點:

該方案的優點是很好地解決了分布式事務問題,實現了最終一致性。缺點是消息表會耦合到業務系統中。

最大努力通知

什么是最大通知

最大努力通知也是一種分布式事務解決方案。下面是企業網銀轉賬一個例子

309445ce-47c2-11ee-97a6-92fbcf53809c.jpg
  • 企業網銀系統調用前置接口,跳轉到轉賬頁
  • 企業網銀調用轉賬系統接口
  • 轉賬系統完成轉賬處理,向企業網銀系統發起轉賬結果通知,若通知失敗,則轉賬系統按策略進行重復通知。
  • 企業網銀系統未接收到通知,會主動調用轉賬系統的接口查詢轉賬結果。
  • 轉賬系統會遇到退匯等情況,會定時回來對賬。

最大努力通知方案的目標,就是發起通知方通過一定的機制,最大努力將業務處理結果通知到接收方 。最大努力通知實現機制如下:

30ab3946-47c2-11ee-97a6-92fbcf53809c.png
最大努力通知解決方案

要實現最大努力通知,可以采用MQ的ack機制。

方案

30c20ff4-47c2-11ee-97a6-92fbcf53809c.jpg
  • 1.發起方將通知發給MQ。
  • 2.接收通知方監聽MQ消息。
  • 3.接收通知方收到消息后,處理完業務,回應ack。
  • 4.接收通知方若沒有回應ack,則MQ會間隔1min、5min、10min等重復通知。
  • 5.接受通知方可用消息校對接口,保證消息的一致性。

轉賬業務實現流程圖:

30e24a80-47c2-11ee-97a6-92fbcf53809c.png

交互流程如下:

  • 1、用戶請求轉賬系統進行轉賬。
  • 2、轉賬系統完成轉賬,將轉賬結果發給MQ。
  • 3、企業網銀系統監聽MQ,接收轉賬結果通知,如果接收不到消息,MQ會重復發送通知。接收到轉賬結果,更新轉賬狀態。
  • 4、企業網銀系統也可以主動查詢轉賬系統的轉賬結果查詢接口,更新轉賬狀態。

Saga事務

Saga事務由普林斯頓大學的Hector Garcia-Molina和Kenneth Salem提出,其核心思想是將長事務拆分為多個本地短事務,由Saga事務協調器協調,如果正常結束那就正常完成,如果某個步驟失敗,則根據相反順序一次調用補償操作。

saga簡介

  • Saga = Long Live Transaction (LLT,長活事務)
  • LLT = T1 + T2 + T3 + ... + Ti(Ti為本地短事務)
  • 每個本地事務Ti 有對應的補償 Ci

Saga的執行順序

  • 正常情況:T1 T2 T3 ... Tn
  • 異常情況:T1 T2 T3 C3 C2 C1

Saga兩種恢復策略

  • 向后恢復,如果任意本地子事務失敗,補償已完成的事務。如異常情況的執行順序T1 T2 Ti Ci C2 C1.
  • 向前恢復,即重試失敗的事務,假設最后每個子事務都會成功。執行順序:T1, T2, ..., Tj(失敗), Tj(重試),..., Tn。

舉個例子,假設用戶下訂單,花10塊錢購買了10多玫瑰,則有

T1=下訂單 ,T2=扣用戶10塊錢,T3=用戶加10朵玫瑰, T4=庫存減10朵玫瑰

C1=取消訂單 ,C2= 給用戶加10塊錢,C3 =用戶減10朵玫瑰, C4=庫存加10朵玫瑰

30f57be6-47c2-11ee-97a6-92fbcf53809c.png

假設事務執行到T4發生異常回滾,在C4的要把玫瑰給庫存加回去的時候,發現用戶的玫瑰都用掉了,這是Saga的一個缺點 ,由于事務之間沒有隔離性導致的問題。

可以通過以下方案解決這個問題

  • 在應?層?加?邏輯鎖的邏輯。

  • Session層?隔離來保證串?化操作。

  • 業務層?采?預先凍結資?的?式隔離此部分資?。

  • 業務操作過程中通過及時讀取當前狀態的?式獲取更新。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據庫
    +關注

    關注

    7

    文章

    3821

    瀏覽量

    64506
  • 管理器
    +關注

    關注

    0

    文章

    246

    瀏覽量

    18545
  • 分布式
    +關注

    關注

    1

    文章

    908

    瀏覽量

    74557

原文標題:后端程序員必備:分布式事務基礎篇

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    [狂人C程序員入門必備].鍵盤農夫.掃描版

    [狂人C程序員入門必備].鍵盤農夫.掃描版
    發表于 03-06 22:21

    微服務架構下分布式事務解決方案 —— 阿里GTS

    摘要: 本文將深入和大家探討微服務架構下,分布式事務的各種解決方案,并重點為大家解讀阿里巴巴提出的分布式事務解決方案----GTS。該方案中提到的GTS是全新一代解決微服務問題的
    發表于 03-16 11:14

    一行代碼,保障分布式事務一致性—GTS:微服務架構下分布式事務解決方案

    摘要: 雖然微服務現在如火如荼,但對其實踐其實仍處于初級階段。即使互聯網巨頭的實踐也大多是試驗層面,鮮有核心業務系統微服務化的案例。GTS是目前業界第一款,也是唯一的一款通用的解決微服務分布式事務
    發表于 06-05 19:14

    如果Microsoft分布式事務處理協調器MSDTC未運行,PSoC Programmer安裝程序將崩潰

    這個問題影響程序員3、3.05、3.06和3.10的“beta 1”版本。如果在“控制面板”和“管理工具”和“服務”列表中的服務列表中缺少“分布式事務協調器”服務,則安裝程序崩潰。要解
    發表于 02-27 15:48

    程序員羊皮卷下載版(程序員必備)

    程序員羊皮卷下載版(程序員必備)
    發表于 09-06 16:04 ?0次下載

    分布式事務控制的原理實例分析

    對于分布式數據庫而言,分布式事務控制是重點和難點,一直以來沒有成熟的方案可以突破CAP理論,幾乎每個分布式數據庫研發團隊都在分布式
    發表于 09-28 19:04 ?0次下載
    <b class='flag-5'>分布式</b><b class='flag-5'>事務</b>控制的原理實例分析

    程序員必備專用單詞快來學習吧!

    本文檔的主要內容是程序員必備的專用單詞快來學習吧!
    發表于 08-14 17:41 ?24次下載
    <b class='flag-5'>程序員</b><b class='flag-5'>必備</b>專用單詞快來學習吧!

    Apache RocketMQ 正式開源分布式事務消息

    版本開源了社區最為關心的分布式事務消息,而且實現了對外部組件的零依賴。接下來,本文將詳細探秘RocketMQ事務消息的設計原理以及實現機制。一、需求緣起在微服務架構中,隨著服務的逐步拆分,數據庫私有
    發表于 08-20 15:15 ?325次閱讀

    程序員求職時必備技能有哪些

    近日國外開發者平臺 HankerRank 發布了 2018 年開發者技能調查報告,本文摘錄程序員求職時必備技能相關的調查結果。
    的頭像 發表于 10-25 10:22 ?2022次閱讀
    <b class='flag-5'>程序員</b>求職時<b class='flag-5'>必備</b>技能有哪些

    程序員如何定義

    當了幾年的程序員了,一直都在想一個問題,什么是程序員,程序員應該做好那些事情,什么樣的程序員是有素質的程序員?什么樣的
    的頭像 發表于 12-18 14:15 ?2642次閱讀

    一位程序員對自己職業的看法

    我個人是一個程序員,關注web、分布式和數據處理。
    的頭像 發表于 12-19 13:53 ?4496次閱讀

    什么是程序員

    當了幾年的程序員了,一直都在想一個問題,什么是程序員程序員應該做好那些事情,什么樣的程序員是有素質的程序員?什么樣的
    的頭像 發表于 06-04 16:21 ?9021次閱讀

    后端程序員的成長指南

    前端領域如火如荼,工資水平也水漲船高。作為后端程序員的你,羨慕嗎?但羨慕是沒用的,更別提嫉妒恨了。古人曰:與其臨淵羨魚,不如退而結網。
    的頭像 發表于 01-13 15:50 ?2445次閱讀

    springcloud分布式事務解決方案

    Spring Cloud是一套用于構建分布式系統的開源框架,它提供了一系列組件和工具,可以幫助開發人員快速構建和管理基于微服務架構的應用程序。在分布式系統中,事務的處理是一個重要的問題
    的頭像 發表于 11-16 11:03 ?2054次閱讀

    springcloud 分布式事務解決方案實例

    Spring Cloud是一套用于構建分布式系統的開發工具集,可以用于解決分布式系統中的各種問題,包括分布式事務。在分布式系統中,由于業務邏
    的頭像 發表于 12-03 16:32 ?1155次閱讀
    主站蜘蛛池模板: 日本aaaaa毛片动漫| 狠狠干奇米| 亚洲伊人久久大香线蕉影院| 久久久久国产成人精品亚洲午夜| 色综网| 天堂网在线www资源网| 欧美黄页| 在线色片| 国产精品入口免费视频| 不卡无毒免费毛片视频观看| 中国一级特黄剌激爽毛片| 加勒比综合网| 成人三级毛片| 特黄级| 亚洲综合色dddd26| 亚洲高清视频一区| 一级久久久| 日本免费精品视频| 三级黄色在线视频中文| 免费高清一级欧美片在线观看| 日日干夜夜操s8| 美女爱爱网站| 久久新地址| 91网视频在线观看| 免费看国产片| 免费被视频网站在线观看| 欧美操穴视频| 欧美黑人性受xxxx精品| 美女扒开尿口让男人桶| 好爽好黄的视频| 欧美亚洲在线| 婷婷色六月| 激情网站网址| 日韩免费一级| 亚洲精品资源在线| 天堂视频在线观看| 噜噜噜噜影院| 天天影视欧美综合在线观看| 欧美涩区| 天天色爱| 国产日本在线播放|