深入理解分布式事務

2020-09-25 IT周邊商城

1、什麼是分布式事務

分布式事務就是指事務的參與者、支持事務的伺服器、資源伺服器以及事務管理器分別位於不同的分布式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的伺服器上,且屬於不同的應用,分布式事務需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分布式事務就是為了保證不同資料庫的數據一致性。

2、分布式事務的產生的原因 2.1、資料庫分庫分表

當資料庫單表一年產生的數據超過1000W,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的一個資料庫變成了多個資料庫。這時候,如果一個操作既訪問01庫,又訪問02庫,而且要保證數據的一致性,那麼就要用到分布式事務。

2.2、應用SOA化

所謂的SOA化,就是業務的服務化。比如原來單機支撐了整個電商網站,現在對整個網站進行拆解,分離出了訂單中心、用戶中心、庫存中心。對於訂單中心,有專門的資料庫存儲訂單信息,用戶中心也有專門的資料庫存儲用戶信息,庫存中心也會有專門的資料庫存儲庫存信息。這時候如果要同時對訂單和庫存進行操作,那麼就會涉及到訂單資料庫和庫存資料庫,為了保證數據一致性,就需要用到分布式事務。

以上兩種情況表象不同,但是本質相同,都是因為要操作的資料庫變多了!

3、事務的ACID特性 3.1、原子性(A)

所謂的原子性就是說,在整個事務中的所有操作,要麼全部完成,要麼全部不做,沒有中間狀態。對於事務在執行中發生錯誤,所有的操作都會被回滾,整個事務就像從沒被執行過一樣。

3.2、一致性(C)

事務的執行必須保證系統的一致性,就拿轉帳為例,A有500元,B有300元,如果在一個事務裡A成功轉給B50元,那麼不管並發多少,不管發生什麼,只要事務執行成功了,那麼最後A帳戶一定是450元,B帳戶一定是350元。

3.3、隔離性(I)

所謂的隔離性就是說,事務與事務之間不會互相影響,一個事務的中間狀態不會被其他事務感知。

3.4、持久性(D)

所謂的持久性,就是說一單事務完成了,那麼事務對數據所做的變更就完全保存在了資料庫中,即使發生停電,系統宕機也是如此。

4、分布式事務的應用場景 4.1、支付

最經典的場景就是支付了,一筆支付,是對買家帳戶進行扣款,同時對賣家帳戶進行加錢,這些操作必須在一個事務裡執行,要麼全部成功,要麼全部失敗。而對於買家帳戶屬於買家中心,對應的是買家資料庫,而賣家帳戶屬於賣家中心,對應的是賣家資料庫,對不同資料庫的操作必然需要引入分布式事務。

4.2、在線下單

買家在電商平臺下單,往往會涉及到兩個動作,一個是扣庫存,第二個是更新訂單狀態,庫存和訂單一般屬於不同的資料庫,需要使用分布式事務保證數據一致性。

5、常見的分布式事務解決方案 5.1、基於XA協議的兩階段提交

XA是一個分布式事務協議,由Tuxedo提出。XA中大致分為兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由資料庫實現,比如Oracle、DB2這些商業資料庫都實現了XA接口,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA實現分布式事務的原理如下:

總的來說,XA協議比較簡單,而且一旦商業資料庫實現了XA協議,使用分布式事務的成本也比較低。但是,XA也有致命的缺點,那就是性能不理想,特別是在交易下單鏈路,往往並發量很高,XA無法滿足高並發場景。XA目前在商業資料庫支持的比較理想,在mysql資料庫中支持的不太理想,mysql的XA實現,沒有記錄prepare階段日誌,主備切換回導致主庫與備庫數據不一致。許多nosql也沒有支持XA,這讓XA的應用場景變得非常狹隘。

5.2、消息事務+最終一致性

所謂的消息事務就是基於消息中間件的兩階段提交,本質上是對消息中間件的一種特殊利用,它是將本地事務和發消息放在了一個分布式事務裡,保證要麼本地操作成功成功並且對外發消息成功,要麼兩者都失敗,開源的RocketMQ就支持這一特性,具體原理如下:

1、A系統向消息中間件發送一條預備消息 2、消息中間件保存預備消息並返回成功 3、A執行本地事務 4、A發送提交消息給消息中間件

通過以上4步完成了一個消息事務。對於以上的4個步驟,每個步驟都可能產生錯誤,下面一一分析:

步驟一出錯,則整個事務失敗,不會執行A的本地操作;

步驟二出錯,則整個事務失敗,不會執行A的本地操作;

步驟三出錯,這時候需要回滾預備消息,怎麼回滾?答案是A系統實現一個消息中間件的回調接口,消息中間件會去不斷執行回調接口,檢查A事務執行是否執行成功,如果失敗則回滾預備消息;

步驟四出錯,這時候A的本地事務是成功的,那麼消息中間件要回滾A嗎?答案是不需要,其實通過回調接口,消息中間件能夠檢查到A執行成功了,這時候其實不需要A發提交消息了,消息中間件可以自己對消息進行提交,從而完成整個消息事務。

基於消息中間件的兩階段提交往往用在高並發場景下,將一個分布式事務拆成一個消息事務(A系統的本地操作+發消息)+B系統的本地操作,其中B系統的操作由消息驅動,只要消息事務成功,那麼A操作一定成功,消息也一定發出來了,這時候B會收到消息去執行本地操作,如果本地操作失敗,消息會重投,直到B操作成功,這樣就變相地實現了A與B的分布式事務。原理如下:

雖然上面的方案能夠完成A和B的操作,但是A和B並不是嚴格一致的,而是最終一致的,我們在這裡犧牲了一致性,換來了性能的大幅度提升。當然,這種玩法也是有風險的,如果B一直執行不成功,那麼一致性會被破壞,具體要不要玩,還是得看業務能夠承擔多少風險。

5.3、TCC編程模式

所謂的TCC編程模式,也是兩階段提交的一個變種。TCC提供了一個編程框架,將整個業務邏輯分為三塊:Try、Confirm和Cancel三個操作。以在線下單為例,Try階段會去扣庫存,Confirm階段則是去更新訂單狀態,如果更新訂單失敗,則進入Cancel階段,會去恢復庫存。總之,TCC就是通過代碼人為實現了兩階段提交,不同的業務場景所寫的代碼都不一樣,複雜度也不一樣,因此,這種模式並不能很好地被復用。

6、總結

分布式事務,本質上是對多個資料庫的事務進行統一控制,按照控制力度可以分為:不控制、部分控制和完全控制。不控制就是不引入分布式事務,部分控制就是各種變種的兩階段提交,包括上面提到的消息事務+最終一致性、TCC模式,而完全控制就是完全實現兩階段提交。部分控制的好處是並發量和性能很好,缺點是數據一致性減弱了,完全控制則是犧牲了性能,保障了一致性,具體用哪種方式,最終還是取決於業務場景。作為技術人員,一定不能忘了技術是為業務服務的,不要為了技術而技術,針對不同業務進行技術選型也是一種很重要的能力!

歡迎關注,關注後點擊下方了解更多,拍下程式設計師python快捷鍵滑鼠墊 ,截圖私聊作者領取大量學習資料,並且每月隨機抽取20名粉絲進入高級技術交流群(大量資料、BAT員工)!

相關焦點

  • 這樣理解分布式事務你是不是就會懂了?
    分布式事務主要解決分布式一致性的問題。說到底就是數據的分布式操作導致僅依靠本地事務無法保證原的性。與單機版的事務不同的是,單機是把多個命令打包成一個統一處理,分布式事務是將多個機器上執行的命令打包成一個命令統一處理。
  • 分布式事務和分布式hash
    NeverTh | 作者urlify.cn/fM36be | 來源分布式事務是什麼?分布式事務就是保證各個微服務之間數據一致,本質上就是保證不同資料庫的數據一致性。大致流程:準備階段 向各個參與者發送準備命令,可以理解為把除了提交事務之外的事情都做好。所有參與者都返回準備成功則下一階段提交事務,否則下一階段協調者就會向所有參與者發送回滾事務的請求,即分布式事務執行失敗。提交階段 可能提交事務也可能回滾事務,並且存在回滾失敗或者提交失敗,失敗之後就會不斷重試。
  • 5分鐘理解架構師必備的:分布式事務解決方案
    為了保證分布式環境下數據強一致性,需要引入分布式事務,而分布式事務由於網絡環境的不確定性,天生就很難實現分布式下,我想要強一致性為了保證分布式事務的正確性,目前網際網路領域有幾種流行的解決方案,但是大部分都沒有像XA事務一樣形成標準的工業規範。但是這些方案在某些特定的行業或者業務場景下卻得到了越來越多的開發者的認可。
  • 分布式事務還不理解?這一篇帶你走進它的世界
    這篇文章將介紹什麼是分布式事務,分布式事務解決什麼問題,對分布式事務實現的難點,解決思路,不同場景下方案的選擇,通過圖解的方式進行梳理、總結和比較。相信耐心看完這篇文章,談到分布式事務,不在只是有「2PC」、「3PC」、「MQ的消息事務」、「最終一致性」、「TCC」等這些知識碎片,而是能夠將知識連成一片,形成知識體系。
  • 12張圖帶你徹底理解分布式事務產生的場景和解決方案
    寫在前面寫這篇文章的背景是有個跟我關係不錯的小夥伴去某大型網際網路公司面試,面試官問了他關於分布式事務的問題,不巧的是他確實對分布式事務掌握的不是很深入,面試的結果挺遺憾的。不過,這位小夥伴還是挺樂觀的,讓我寫寫關於【分布式事務】的系列文章,想提升自己關於分布式事務的短板,那我就寫一個【分布式事務】專題吧,專題的內容計劃是從原理、框架源碼到企業級實現,這篇文章也算是整個專題的開篇吧。希望能夠為小夥伴們帶來實質性的幫助。本地事務本地事務流程在介紹分布式事務之前,我們先來看看本地事務。首先,我們先來一張圖。
  • 一文看懂分布式事務
    它允許多個應用程式共享由多個資源管理器提供的資源,並允許其工作被協調為全局事務:ApplicationProgram(AP),應用程式定義了事務邊界並指定構成事務的操作。ResourceManager(RM),資源管理器用來管理我們需要訪問的共享資源,我們可以將它理解為關係資料庫、文件存儲系統、消息隊列、印表機等。
  • 面試官:談談對分布式事務的一點理解和解決方案
    分布式事務首先,做系統拆分的時候幾乎都會遇到分布式事務的問題,一個仿真的案例如下:目前業界提供的解決方案業界目前主流的分布式事務解決方案主要有:多階段提交方案(2PC、3PC)、補償事務(TCC)和消息事務(主要是RocketMQ,基本思想也是多階段提交方案,並且基於中間提供件輪詢和重試,其他消息隊列中間件並沒有實現分布式事務)。
  • 分布式事務方案 - SAGA模式
    __biz=MzA4Nzc4MjI4MQ==&mid=2652404032&idx=1&sn=f3e7d518e7cbbe797d4eefbf355e27da本文目的是講清楚 SAGA 這種分布式事務解決方案的實現思路,
  • 透徹,分布式事務一網打盡
    今天我想和大家一起盤一盤分布式事務,會介紹常見的分布式事務實現方案和其優缺點以及適用的場景,並會帶出它們的一些變體實現。還會捎帶一下分布式資料庫對 2PC 的改進模型,看看分布式資料庫是如何做的。然後再分析一波分布式事務框架 Seata 的具體實現,看看分布式事務究竟是如何落地的,畢竟協議要落地才是有用的。
  • 肝完這份MQ+分布式事務套餐,其實阿里P8你也值得
    更嚴格來說,可以用 ACID 四個特性表述事務:Atomicity:原子性,事務中的所有操作要麼都成功執行,要麼都取消執行,不能存在部分執行,部分不執行的狀態。Consistency:一致性,舉個例子簡單的理解就是,A、B 兩個帳戶各有 100 元,無論兩個帳戶並發相互轉帳多少次,兩個帳戶的資金總額依然是 200 元。
  • 如何選擇分布式事務解決方案?
    阿里妹導讀:分布式事務中涉及的參與者分布在異步網絡中,參與者通過網絡通信來達到分布式一致性,網絡通信不可避免出現失敗、超時的情況,因此分布式事務的實現比本地事務面臨更多的困難。本文歸納總結五種分布式事務解決方案,並剖析其特點。較長,同學們可收藏後再看。文末福利:Java 程式設計師學習清單。
  • 網易輕舟微服務助力工行分布式事務系統建設
    隨著工商銀行對數位化探索的進一步深入,分布式架構的更多技術難題也在一一浮現,分布式事務就是其中之一。工行原有的事務場景主要依賴於Oracle資料庫和對帳系統實現,一方面使用成本高,另一方面,隨著業務的不斷發展,該方式也達到了性能極致,難以通過擴容支撐。工行也曾嘗試基於開源分布式事務自研組件,但由於對業務的侵入性強、性能低、異常率大,依然難以支撐大規模應用。
  • 女朋友問敖丙:什麼是分布式事務?
    前言上一篇文章已經講完分布式了,那暖男說要講分布式事務那就一定會講,只是我估計大家沒料到暖男這麼快就肝好了吧?事務想必大家並不陌生,至於什麼是 ACID,也是老生常談了。不過暖男為了保證文章的完整性確保所有人都聽得懂,我還是得先說說 ACID,然後再來介紹下什麼是分布式事務和常見的分布式事務包括 2PC、3PC、TCC、本地消息表、消息事務、最大努力通知。事務嚴格意義上的事務實現應該是具備原子性、一致性、隔離性和持久性,簡稱 ACID。
  • 分布式事務的七種實現方案匯總
    閱讀本文之前,需要你對資料庫事務的ACID、CAP理論、Base理論以及兩階段提交有一定的認知,不熟悉者請自行百度或者閱讀參考博客1、2、3和4。除此之外,在閱讀本文過程中,如果對某種方案不理解,強烈建議先閱讀對應方案中的參考博客後再閱讀本文中對應的介紹。
  • 為什麼要有分布式事務 分布式事務解決的什麼問題 一次解答
    可以這麼認為,分布式事務是在分布式環境下能保證數據一致性程序單元 在說說什麼是數據一致性,數據一致性是相對的,是複合邏輯的數據統一。  比如張三轉帳給李四,張三-100,李四+100. 這是一致。       解釋 分布式環境 為什麼會出 一致性問題,所以分布式事務就是來解決這些問題的。
  • 大廠面試系列(九):MQ和分布式事務
    * 3、本地消息表(異步確保) 核心思想是將分布式事務拆分成本地事務進行處理,消息生產方,需要額外建一個消息表,並記錄消息發送狀態。消息表和業務數據要在一個事務裡提交,也就是說他們要在一個資料庫裡面。然後消息會經過MQ發送到消息的消費方。如果消息發送失敗,會進行重試發送。 優點: 一種非常經典的實現,避免了分布式事務,實現了最終一致性。在 .NET中 有現成的解決方案。
  • 阿里終面:分布式事務原理
    分布式系統中常用的分布式事務解決方案,這些解決方案可以保證業務代碼在操作多個數據源的時候,能夠像操作單個數據源一樣,具備 ACID 特性。常見分布式事務解決方案2.1.現代企業多採用分布式的微服務,因此更多的是要解決多個微服務之間的分布式事務問題。
  • 分布式事務淺析及簡單實現
    作者:翟飛在分布式系統中,為了保證數據的高可用,通常,我們會將數據保留多個副本(replica),這些副本會放置在不同的物理的機器上。為了對用戶提供正確的 CRUD 等語義,我們需要保證這些放置在不同物理機器上的副本是一致的。分布式事務在現在遍地都是分布式部署的系統中幾乎是必要的。
  • 分布式事務:從理論到實踐(二)
    前文我們提到了Seata的AT和TCC模式,本文中我們針對這兩個模式進行深入分析和開發實踐。AT 模式原理回顧根據 官方文檔 及提供的 博客 我們先回顧一下AT模式下分布式事務的原理AT 模式的一階段、二階段提交和回滾均由 Seata 框架自動生成,用戶只需編寫「業務 SQL」,便能輕鬆接入分布式事務
  • 兩天,我把分布式事務搞完了
    今天我想和大家一起盤一盤分布式事務,會介紹常見的分布式事務實現方案和其優缺點以及適用的場景,並會帶出它們的一些變體實現。然後再分析一波分布式事務框架 Seata 的具體實現,看看分布式事務究竟是如何落地的,畢竟協議要落地才是有用的。