掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:Jay_huaxiao 2020-03-05 08:00:05
架構(gòu)
分布式 數(shù)據(jù)庫事務(wù)(簡稱:事務(wù)),是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成。這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位。

最近看了幾篇有關(guān)于分布式事務(wù)的博文,做了一下筆記,并總結(jié)出這篇文章。
圖片來自 Pexels
數(shù)據(jù)庫事務(wù)
數(shù)據(jù)庫事務(wù)(簡稱:事務(wù)),是數(shù)據(jù)庫管理系統(tǒng)執(zhí)行過程中的一個邏輯單位,由一個有限的數(shù)據(jù)庫操作序列構(gòu)成。
這些操作要么全部執(zhí)行,要么全部不執(zhí)行,是一個不可分割的工作單位。
數(shù)據(jù)庫事務(wù)的幾個典型特性:
簡稱就是 ACID:
事務(wù)的實現(xiàn)原理
本地事務(wù)
傳統(tǒng)的單服務(wù)器,單關(guān)系型數(shù)據(jù)庫下的事務(wù),就是本地事務(wù)。本地事務(wù)由資源管理器管理,JDBC 事務(wù)就是一個非常典型的本地事務(wù)。
事務(wù)日志
InnoDB 事務(wù)日志包括 redo log 和 undo log。
redo log(重做日志):通常是物理日志,記錄的是數(shù)據(jù)頁的物理修改,而不是某一行或某幾行修改成怎樣,它用來恢復(fù)提交后的物理數(shù)據(jù)頁。
undo log(回滾日志):是邏輯日志,和 redo log 記錄物理日志的不一樣。
可以這樣認(rèn)為,當(dāng) delete 一條記錄時,undo log 中會記錄一條對應(yīng)的 insert 記錄,當(dāng) update 一條記錄時,它記錄一條對應(yīng)相反的 update 記錄。
事務(wù) ACID 特性的實現(xiàn)思想:
分布式事務(wù)
分布式事務(wù)就是指事務(wù)的參與者、支持事務(wù)的服務(wù)器、資源服務(wù)器以及事務(wù)管理器分別位于不同的分布式系統(tǒng)的不同節(jié)點之上。
簡單來說,分布式事務(wù)指的就是分布式系統(tǒng)中的事務(wù),它的存在就是為了保證不同數(shù)據(jù)庫節(jié)點的數(shù)據(jù)一致性。
為什么需要分布式事務(wù)?接下來分兩方面闡述:
微服務(wù)架構(gòu)下的分布式事務(wù)
隨著互聯(lián)網(wǎng)的快速發(fā)展,輕盈且功能劃分明確的微服務(wù),登上了歷史舞臺。
比如,一個用戶下訂單,購買直播禮物的服務(wù),被拆分成三個 service,分別是金幣服務(wù)(coinService),下訂單服務(wù)(orderService)、禮物服務(wù)(giftService)。
這些服務(wù)都部署在不同的機(jī)器上(節(jié)點),對應(yīng)的數(shù)據(jù)庫(金幣數(shù)據(jù)庫、訂單數(shù)據(jù)庫、禮物數(shù)據(jù)庫)也在不同節(jié)點上。
用戶下單購買禮物,禮物數(shù)據(jù)庫、金幣數(shù)據(jù)庫、訂單數(shù)據(jù)庫在不同節(jié)點上,用本地事務(wù)是不可以的,那么如何保證不同數(shù)據(jù)庫(節(jié)點)上的數(shù)據(jù)一致性呢?這就需要分布式事務(wù)啦!
分庫分表下的分布式事務(wù)
隨著業(yè)務(wù)的發(fā)展,數(shù)據(jù)庫的數(shù)據(jù)日益龐大,超過千萬級別的數(shù)據(jù),我們就需要對它分庫分表(以前公司是用 Mycat 分庫分表,后來用 Sharding-JDBC)。
一分庫,數(shù)據(jù)又分布在不同節(jié)點上啦,比如有的在深圳機(jī)房,有的在北京機(jī)房~你再想用本地事務(wù)去保證,已經(jīng)無動于衷啦~還是需要分布式事務(wù)啦。
比如 A 轉(zhuǎn) 10 塊給 B,A 的賬戶數(shù)據(jù)是在北京機(jī)房,B 的賬戶數(shù)據(jù)是在深圳機(jī)房。
流程如下:
CAP 理論&BASE 理論
學(xué)習(xí)分布式事務(wù),當(dāng)然需要了解 CAP 理論和BASE 理論。
CAP 理論
CAP 理論作為分布式系統(tǒng)的基礎(chǔ)理論,指的是在一個分布式系統(tǒng)中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分區(qū)容錯性),這三個要素最多只能同時實現(xiàn)兩點。
一致性(C,Consistency):一致性是指數(shù)據(jù)在多個副本之間能否保持一致的特性。
例如一個數(shù)據(jù)在某個分區(qū)節(jié)點更新之后,在其他分區(qū)節(jié)點讀出來的數(shù)據(jù)也是更新之后的數(shù)據(jù)。
可用性(A:Availability):可用性是指系統(tǒng)提供的服務(wù)必須一直處于可用的狀態(tài),對于用戶的每一個操作請求總是能夠在有限的時間內(nèi)返回結(jié)果。這里的重點是"有限時間內(nèi)"和"返回結(jié)果"。
分區(qū)容錯性(P,Partition tolerance):分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時候,仍然需要能夠保證對外提供滿足一致性和可用性的服務(wù)。
BASE 理論
BASE 理論, 是對 CAP 中 AP 的一個擴(kuò)展,對于我們的業(yè)務(wù)系統(tǒng),我們考慮犧牲一致性來換取系統(tǒng)的可用性和分區(qū)容錯性。
BASE 是 Basically Available(基本可用),Soft State(軟狀態(tài))和 Eventually Consistent(最終一致性)三個短語的縮寫。
Basically Available:基本可用。通過支持局部故障而不是系統(tǒng)全局故障來實現(xiàn)的。
如將用戶分區(qū)在 5 個數(shù)據(jù)庫服務(wù)器上,一個用戶數(shù)據(jù)庫的故障只影響這臺特定主機(jī)那 20% 的用戶,其他用戶不受影響。
Soft State:軟狀態(tài)。狀態(tài)可以有一段時間不同步。
Eventually Consistent:最終一致。最終數(shù)據(jù)是一致的就可以了,而不是時時保持強(qiáng)一致。
分布式事務(wù)的幾種解決方案
分布式事務(wù)解決方案主要有以下這幾種:
二階段提交方案
二階段提交方案是常用的分布式事務(wù)解決方案。事務(wù)的提交分為兩個階段:準(zhǔn)備階段和提交執(zhí)行方案。
二階段提交成功的情況:
如圖:
二階段提交失敗的情況:
資源管理器根據(jù)事務(wù)管理器的指令回滾本地事務(wù)操作,釋放所有事務(wù)處理過程中使用的鎖資源 。
2PC 方案實現(xiàn)起來簡單,成本較低,但是主要有以下缺點:
TCC(補(bǔ)償機(jī)制)
TCC 采用了補(bǔ)償機(jī)制,其核心思想是:針對每個操作,都要注冊一個與其對應(yīng)的確認(rèn)和補(bǔ)償(撤銷)操作。
TCC(Try-Confirm-Cancel)是通過對業(yè)務(wù)邏輯的分解來實現(xiàn)分布式事務(wù)。
針對一個具體的業(yè)務(wù)服務(wù),TCC 分布式事務(wù)模型需要業(yè)務(wù)系統(tǒng)都實現(xiàn)一下三段邏輯:
TCC 分布式事務(wù)模型包括如下三部分:
下面再拿用戶下單購買禮物作為例子來模擬 TCC 實現(xiàn)分布式事務(wù)的過程:假設(shè)用戶 A 余額為 100 金幣,擁有的禮物為 5 朵。A 花了 10 個金幣,下訂單,購買 10 朵玫瑰。余額、訂單、禮物都在不同數(shù)據(jù)庫。
TCC 的 Try 階段:
TCC 的 Confirm 階段:
TCC 的 Cancel 階段:
TCC 方案讓應(yīng)用可以自定義數(shù)據(jù)庫操作的粒度,降低了鎖沖突,可以提升性能。
但是也有以下缺點:
本地消息表
eBay 最初提出本地消息表這個方案,來解決分布式事務(wù)問題。業(yè)界目前使用這種方案是比較多的,它的核心思想就是將分布式事務(wù)拆分成本地事務(wù)進(jìn)行處理。
可以看一下基本的實現(xiàn)流程圖:
基本實現(xiàn)思路如下:
發(fā)送消息方:
消息消費方:
生產(chǎn)方和消費方定時掃描本地消息表,把還沒處理完成的消息或者失敗的消息再發(fā)送一遍。如果有靠譜的自動對賬補(bǔ)賬邏輯,這種方案還是非常實用的。
優(yōu)缺點:該方案的優(yōu)點是很好地解決了分布式事務(wù)問題,實現(xiàn)了最終一致性。缺點是消息表會耦合到業(yè)務(wù)系統(tǒng)中。
最大努力通知
什么是最大通知?最大努力通知也是一種分布式事務(wù)解決方案。
下面是企業(yè)網(wǎng)銀轉(zhuǎn)賬的一個例子:
最大努力通知方案的目標(biāo),就是發(fā)起通知方通過一定的機(jī)制,最大努力將業(yè)務(wù)處理結(jié)果通知到接收方。
最大努力通知實現(xiàn)機(jī)制如下:
最大努力通知解決方案:要實現(xiàn)最大努力通知,可以采用 MQ 的 ACK 機(jī)制。
方案如下:
轉(zhuǎn)賬業(yè)務(wù)實現(xiàn)流程圖:
交互流程如下:
Saga 事務(wù)
Saga 事務(wù)由普林斯頓大學(xué)的 Hector Garcia-Molina 和 Kenneth Salem 提出。
其核心思想是將長事務(wù)拆分為多個本地短事務(wù),由 Saga 事務(wù)協(xié)調(diào)器協(xié)調(diào),如果正常結(jié)束那就正常完成,如果某個步驟失敗,則根據(jù)相反順序一次調(diào)用補(bǔ)償操作。
Saga 簡介:
Saga 的執(zhí)行順序:
Saga 兩種恢復(fù)策略:
舉個例子,假設(shè)用戶下訂單,花 10 塊錢購買了 10 多玫瑰,則有:
假設(shè)事務(wù)執(zhí)行到 T4 發(fā)生異常回滾,在 C4 的要把玫瑰給庫存加回去的時候,發(fā)現(xiàn)用戶的玫瑰都用掉了,這是 Saga 的一個缺點,由于事務(wù)之間沒有隔離性導(dǎo)致的問題。
可以通過以下方案解決這個問題:
參考與感謝:

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流