分布式架構系列 - 分布式事務 01(基礎篇)
閱讀全文,約 10?分鐘
這是江帥帥的第027篇文章
1、什么是事務?
一般的事務,指的是本地事務,單機上的事務。事務提供了一種機制,能夠將一組操作放在一個不可分割的、獨立的執(zhí)行單元中,其中所有的操作要么被完全執(zhí)行,要么完全失敗。也就是,當其中一個操作執(zhí)行失敗的時候,都會讓整個事務回滾。
2、什么是全局事務?
全局事務是全局事務管理來實現全局管理。
假設有一個事務管理器,多個資源管理器在工作,事務管理器主要控制全局事務,管理事務和協調參與的資源,協同資源的一致提交和回滾等;資源管理器就控制和管理資源。
這里涉及到兩個協議:TX 協議和 XA 協議。
TX 協議:應用或應用服務器與事務管理器的接口。
XA 協議:全局事務管理器和資源事務管理器的接口。XA 協議是 X/Open 組織提出的分布式事務的規(guī)范,當下主流的關系型數據庫產品都實現了 XA 接口,它是雙向的系統(tǒng)接口,為事務管理器和 N 個資源管理器提供通信橋梁。
在分布式系統(tǒng)中,需要引入一個單點來對兩臺機器進行協調,因為它們無法達到一致的狀態(tài),也就是 XA 需要引入事務管理器。這時,全局管理器負責管理和協調的事務,就能跨越多個資源和進程。
3、什么是事務的 ACID 特性?
事務的 ACID 特性,特指本地事務的特性。分布式事務是多個事務的組合,也基本能滿足 ACID,其中一致性是強一致性,為了保證數據一致性或完整性。由于分布式系統(tǒng)規(guī)模不小,也會越來越復雜,當需要達成強一致性將要耗費的時間會更長。后來出現了 BASE 理論,采用最終一致性來代替強一致性。
另外,隔離性是一種嚴格意義上的隔離,串行執(zhí)行的多個事務互不干擾,能夠保證數據的安全性,但性能很低,隔離級別和數據庫的性能是成反比的。數據庫的隔離級別有四種:Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(重復度)、Serializable(序列化)。
原子性(Atomicity):事務是一個不能分割的執(zhí)行單元,只有兩種狀態(tài),要么全部執(zhí)行成功,要么全部不執(zhí)行。如果事務中的出現任何一個操作失敗,整個事務就失敗,將會被回滾到之前的狀態(tài)。
一致性(Consistency):事務在操作前到操作后,數據的完整性保持一致沒有被破環(huán)。
隔離性(Isolation):如果系統(tǒng)內存在多個事務,且并發(fā)執(zhí)行,但他們的執(zhí)行是相互獨立且不會相互干擾,某個事務內部的操作和數據,其他事務不可干涉。
持久性(Durability):當一個事務完成后,處理好的結果也將在數據庫永久保存下來,哪怕系統(tǒng)出現崩潰、宕機,在系統(tǒng)恢復且能重新被訪問,一樣能看到事務提交的結果。
4、什么是分布式事務?
簡單理解,分布式事務是在分布式系統(tǒng)中的本地事務,指在多節(jié)點、多機器、多服務的環(huán)境中涉及的事務操作。
核心點,分布式事務主要是解決在分布式系統(tǒng)環(huán)境下,組合事務的一致性問題。
目前,主要結合消息中間件共同處理相關操作,MQ 能實現異步通信、解耦和并發(fā)緩沖等問題。因為 MQ 擁有高并發(fā)、高吞吐能力,又能緩沖消息、靈活調整消息的處理效率,這就可以提升系統(tǒng)的并發(fā)量。
5、如何實現分布式事務?
常見實現方式有遵從 ACID 的強一致性方式和遵從 BASE 理論的最終一致性方式,分別如下:
1)兩階段提交協議
2)三階段提交協議
3)基于消息的最終一致性
5.1 兩階段提交
基于 XA 協議的兩階段提交協議(Two-phase Commit Protocol, 2PC)方法,主要是 XA 能分離兩部分來看,全局事務管理器和資源事務管理器。它具有能協調多個資源的機制,在 TM(事務管理器) 和 RM(資源管理器) 之間采取兩階段提交的方案來解決一致性問題。
TM 充當協調者,它會根據所有參與的 RM 的操作結果,來判斷和控制是否需要最終提交。這過程會先經過投票,然后提交兩個階段。
過程很簡單,TM 向 RM 發(fā)起準備操作的請求,然后等 RM 的響應。當 RM 接收到請求之后,會去執(zhí)行請求中的事務操作,注意,這里單個 RM 沒那么快提交,只會先記錄日志信息,然后發(fā)送 Yes/No 給 TM,表示成功/終止操作指令。當所有 RM 都發(fā)送 Yes 的時候,才進入最終提交階段,等提交完成后,整個事務就結束了。

從上圖可以看到,協調者下發(fā)請求事務操作,參與者將操作的結果返回協調者,根據所有參與者的最終反饋結果來判斷是要提交呢?還是回滾呢?
5.2 兩階段提交事務解決方案的利弊
1)滿足了事務的 ACID 的特性;
2)在執(zhí)行過程中,2PC是反伸縮模式的,所有參與的節(jié)點都是事務阻塞型的,當業(yè)務規(guī)模越來越大的時候,局限性會更明顯。參與者會一直持有資源直到整個分布式事務結束;
3)容易出現單點故障問題,2PC 類似于集中式算法,萬一 TM 發(fā)生故障,RM 會去等 TM 的消息,然后會導致整個系統(tǒng)都處于停滯狀態(tài)。
4)還有可能出現數據不一致的問題,萬一網絡抖動,網絡局部異常現象,就只有部分 RM 接收到提交請求并執(zhí)行操作,其他未接到提交請求的 RM 就不會執(zhí)行事務提交操作,很明顯的數據不一致問題。
5.3 三階段提交
為了解決上面兩階段提交會遇到的同步阻塞、數據不一致問題,出現了三階段提交協議(Three-phase commit protocol, 3PC),是一套改進方案,因為三階段擁有超時機制和多了一個準備階段。
超時機制很好理解,在 TM 和 RM 之間引入超時機制,如果在規(guī)定時間內沒有收到來自其他節(jié)點的響應信息,那么就會根據當下的狀態(tài)來執(zhí)行提交或者回滾操作。
另外多出來的一個準備階段,其實是 3PC 把 2PC 一分為二,簡單看就是:可以提交、預備提交、執(zhí)行提交三個階段。用這種方式來保證在最后提交之前,各個 RM 節(jié)點的狀態(tài)都是一致的。
主要來看下“預備提交”階段。
分兩種情況,RM 返回的是 Yes,還是 No,然后再決定是否進行預備提交的操作。
如果返回 Yes,那也就是說能夠去提交,接著正常的往下走,提交就是了。大致流程是先發(fā)送預備提交請求,進入預備提交階段;然后執(zhí)行事務操作,在日志中記錄相關信息;最后事務執(zhí)行成功了,得到 ACK 響應反饋,開始進入等待最后的操作指令。
如果返回 No,說明沒戲,直接執(zhí)行中斷事務的操作。大致流程是先發(fā)送中斷請求;然后中斷事務操作。
5.4 基于消息的最終一致性
因為 2PC 和 3PC 都會去鎖定資源,就會降低系統(tǒng)性能,而且也沒解決數據不一致的問題。
那應該怎么辦?回到我們在上面介紹的“什么是分布式事務?”,簡單提過,實際上需要結合消息中間件來共同處理相關操作,通過消息、日志等方式異步執(zhí)行,因為它們可以存儲在本地文件、數據庫或者 MQ 中,加上重試機制,就是基于分布式消息的最終一致性方式來實現分布式事務解決方案。

在分布式事務中,只有當所有的事務都成功了,整個業(yè)務流程才能跑通,分布式事務的一致性是實現分布式事務的關鍵點。

公眾號:江帥帥(ID:NXJSS666)
CSDN 博客:江帥帥

