1.基礎概念
1.1.什么是事務 什么是事務?舉個生活中的例子:你去小賣鋪買東西,“一手交錢,一手交貨”就是一個事務的例子,交錢和交貨必 須全部成功,事務才算成功,任一個活動失敗,事務將撤銷所有已成功的活動。
明白上述例子,再來看事務的定義:
事務可以看做是一次大的活動,它由不同的小活動組成,這些活動要么全部成功,要么全部失敗。
1.2.本地事務 在計算機系統(tǒng)中,更多的是通過關系型數(shù)據(jù)庫來控制事務,這是利用數(shù)據(jù)庫本身的事務特性來實現(xiàn)的,因此叫數(shù)據(jù) 庫事務,由于應用主要靠關系數(shù)據(jù)庫來控制事務,而數(shù)據(jù)庫通常和應用在同一個服務器,所以基于關系型數(shù)據(jù)庫的 事務又被稱為本地事務。 ###### 回顧一下數(shù)據(jù)庫事務的四大特性 ACID:
A(Atomic):原子性,構成事務的所有操作,要么都執(zhí)行完成,要么全部不執(zhí)行,不可能出現(xiàn)部分成功部分失 敗的情況。
C(Consistency):一致性,在事務執(zhí)行前后,數(shù)據(jù)庫的一致性約束沒有被破壞。比如:張三向李四轉(zhuǎn)100元, 轉(zhuǎn)賬前和轉(zhuǎn)賬后的數(shù)據(jù)是正確狀態(tài)這叫一致性,如果出現(xiàn)張三轉(zhuǎn)出100元,李四賬戶沒有增加100元這就出現(xiàn)了數(shù) 據(jù)錯誤,就沒有達到一致性。
I(Isolation):隔離性,數(shù)據(jù)庫中的事務一般都是并發(fā)的,隔離性是指并發(fā)的兩個事務的執(zhí)行互不干擾,一個事 務不能看到其他事務運行過程的中間狀態(tài)。通過配置事務隔離級別可以避臟讀、重復讀等問題。
D(Durability):持久性,事務完成之后,該事務對數(shù)據(jù)的更改會被持久化到數(shù)據(jù)庫,且不會被回滾。 數(shù)據(jù)庫事務在實現(xiàn)時會將一次事務涉及的所有操作全部納入到一個不可分割的執(zhí)行單元,該執(zhí)行單元中的所有操作 要么都成功,要么都失敗,只要其中任一操作執(zhí)行失敗,都將導致整個事務的回滾
1.3.分布式事務 隨著互聯(lián)網(wǎng)的快速發(fā)展,軟件系統(tǒng)由原來的單體應用轉(zhuǎn)變?yōu)榉植际綉?,下圖描述了單體應用向微服務的演變:

截屏2021-10-05 下午4.20.12.png
分布式系統(tǒng)會把一個應用系統(tǒng)拆分為可獨立部署的多個服務,因此需要服務與服務之間遠程協(xié)作才能完成事務操 作,這種分布式系統(tǒng)環(huán)境下由不同的服務之間通過網(wǎng)絡遠程協(xié)作完成事務稱之為分布式事務,例如用戶注冊送積分 事務、創(chuàng)建訂單減庫存事務,銀行轉(zhuǎn)賬事務等都是分布式事務。
我們知道本地事務依賴數(shù)據(jù)庫本身提供的事務特性來實現(xiàn),因此以下邏輯可以控制本地事務:
begin transaction;
//1.本地數(shù)據(jù)庫操作:張三減少金額
//2.本地數(shù)據(jù)庫操作:李四增加金額
commit transation;
但是在分布式環(huán)境下,會變成下邊這樣:
begin transaction;
//1.本地數(shù)據(jù)庫操作:張三減少金額
//2.遠程調(diào)用:讓李四增加金額
commit transation;
可以設想,當遠程調(diào)用讓李四增加金額成功了,由于網(wǎng)絡問題遠程調(diào)用并沒有返回,此時本地事務提交失敗就回滾 了張三減少金額的操作,此時張三和李四的數(shù)據(jù)就不一致了。 因此在分布式架構的基礎上,傳統(tǒng)數(shù)據(jù)庫事務就無法使用了,張三和李四的賬戶不在一個數(shù)據(jù)庫中甚至不在一個應 用系統(tǒng)里,實現(xiàn)轉(zhuǎn)賬事務需要通過遠程調(diào)用,由于網(wǎng)絡問題就會導致分布式事務問題。
1.4 分布式事務產(chǎn)生的場景
1、典型的場景就是微服務架構 微服務之間通過遠程調(diào)用完成事務操作。 比如:訂單微服務和庫存微服務,下單的 同時訂單微服務請求庫存微服務減庫存。 簡言之:跨JVM進程產(chǎn)生分布式事務。

image.png
2、單體系統(tǒng)訪問多個數(shù)據(jù)庫實例 當單體系統(tǒng)需要訪問多個數(shù)據(jù)庫(實例)時就會產(chǎn)生分布式事務。 比如:用戶信 息和訂單信息分別在兩個MySQL實例存儲,用戶管理系統(tǒng)刪除用戶信息,需要分別刪除用戶信息及用戶的訂單信 息,由于數(shù)據(jù)分布在不同的數(shù)據(jù)實例,需要通過不同的數(shù)據(jù)庫鏈接去操作數(shù)據(jù),此時產(chǎn)生分布式事務。 簡言之:跨 數(shù)據(jù)庫實例產(chǎn)生分布式事務。

image.png
3、多服務訪問同一個數(shù)據(jù)庫實例 比如:訂單微服務和庫存微服務即使訪問同一個數(shù)據(jù)庫也會產(chǎn)生分布式事務,原 因就是跨JVM進程,兩個微服務持有了不同的數(shù)據(jù)庫鏈接進行數(shù)據(jù)庫操作,此時產(chǎn)生分布式事務。

image.png
2.分布式事務基礎理論
2.1.CAP理論
2.1.1.理解CAP CAP是 Consistency、Availability、Partition tolerance三個詞語的縮寫,分別表示一致性、可用性、分區(qū)容忍性。
下邊我們分別來解釋: 為了方便對CAP理論的理解,我們結(jié)合電商系統(tǒng)中的一些業(yè)務場景來理解CAP。 如下圖,是商品信息管理的執(zhí)行流程:

image.png
整體執(zhí)行流程如下: 1、商品服務請求主數(shù)據(jù)庫寫入商品信息(添加商品、修改商品、刪除商品) 2、主數(shù)據(jù)庫向商品服務響應寫入成功。 3、商品服務請求從數(shù)據(jù)庫讀取商品信息。
C - Consistency: 一致性是指寫操作后的讀操作可以讀取到最新的數(shù)據(jù)狀態(tài),當數(shù)據(jù)分布在多個節(jié)點上,從任意結(jié)點讀取到的數(shù)據(jù)都 是最新的狀態(tài)。
A - Availability : 可用性是指任何事務操作都可以得到響應結(jié)果,且不會出現(xiàn)響應超時或響應錯誤。
P - Partition tolerance : 通常分布式系統(tǒng)的各各結(jié)點部署在不同的子網(wǎng),這就是網(wǎng)絡分區(qū),不可避免的會出現(xiàn)由于網(wǎng)絡問題而導致結(jié)點之間 通信失敗,此時仍可對外提供服務,這叫分區(qū)容忍性。
2.1.2.CAP組合方式
1、上邊商品管理的例子是否同時具備 CAP呢? 在所有分布式事務場景中不會同時具備CAP三個特性,因為在具備了P的前提下C和A是不能共存的。 比如: 下圖滿足了P即表示實現(xiàn)分區(qū)容忍:

image.png
本圖分區(qū)容忍的含義是:
1)主數(shù)據(jù)庫通過網(wǎng)絡向從數(shù)據(jù)同步數(shù)據(jù),可以認為主從數(shù)據(jù)庫部署在不同的分區(qū),通過網(wǎng)絡進行交互。
2)當主數(shù)據(jù)庫和從數(shù)據(jù)庫之間的網(wǎng)絡出現(xiàn)問題不影響主數(shù)據(jù)庫和從數(shù)據(jù)庫對外提供服務。
3)其一個結(jié)點掛掉不影響另一個結(jié)點對外提供服務。 如果要實現(xiàn)C則必須保證數(shù)據(jù)一致性,在數(shù)據(jù)同步的時候為防止向從數(shù)據(jù)庫查詢不一致的數(shù)據(jù)則需要將從數(shù)據(jù)庫數(shù) 據(jù)鎖定,待同步完成后解鎖,如果同步失敗從數(shù)據(jù)庫要返回錯誤信息或超時信息。 如果要實現(xiàn)A則必須保證數(shù)據(jù)可用性,不管任何時候都可以向從數(shù)據(jù)查詢數(shù)據(jù),則不會響應超時或返回錯誤信息。 通過分析發(fā)現(xiàn)在滿足P的前提下C和A存在矛盾性。
2、CAP有哪些組合方式呢? 所以在生產(chǎn)中對分布式事務處理時要根據(jù)需求來確定滿足CAP的哪兩個方面。
1)AP: 放棄一致性,追求分區(qū)容忍性和可用性。這是很多分布式系統(tǒng)設計時的選擇。
例如:
上邊的商品管理,完全可以實現(xiàn)AP,前提是只要用戶可以接受所查詢的到數(shù)據(jù)在一定時間內(nèi)不是最新的即可。
通常實現(xiàn)AP都會保證最終一致性,后面講的BASE理論就是根據(jù)AP來擴展的,一些業(yè)務場景 比如:訂單退款,今 日退款成功,明日賬戶到賬,只要用戶可以接受在一定時間內(nèi)到賬即可。
2)CP:
放棄可用性,追求一致性和分區(qū)容錯性,我們的zookeeper其實就是追求的強一致,又比如跨行轉(zhuǎn)賬,一次轉(zhuǎn)賬請 求要等待雙方銀行系統(tǒng)都完成整個事務才算完成。
3)CA: 放棄分區(qū)容忍性,即不進行分區(qū),不考慮由于網(wǎng)絡不通或結(jié)點掛掉的問題,則可以實現(xiàn)一致性和可用性。那么系統(tǒng) 將不是一個標準的分布式系統(tǒng),我們最常用的關系型數(shù)據(jù)就滿足了CA。 上邊的商品管理,如果要實現(xiàn)CA則架構如下:

image.png