搜尋
首頁Javajava教程深入理解JAVA分散式事務

深入理解JAVA分散式事務

Apr 03, 2018 pm 02:33 PM
java事務分散式

這篇文章主要介紹了深入理解JAVA分散式事務,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧

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模式,而完全控制就是完全實現兩階段提交。部分控制的好處是並發量和效能很好,缺點是資料一致性減弱了,完全控制則是犧牲了效能,保障了一致性,具體用哪種方式,最終還是取決於業務場景。身為技術人員,一定不能忘了技術是為業務服務的,不要為了技術而技術,針對不同業務進行技術選型也是一種很重要的能力!

以上是深入理解JAVA分散式事務的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。