分布式事務 解決方案之2PC實戰

2021-10-09 03:24:28 字數 2699 閱讀 6386

說完《分布式事務:解決方案之2pc理論》,我們現在就要在理論的基礎上實踐一把。

下面我們通過seata中介軟體實現分布式事務來模擬兩個賬戶的轉賬交易過程。交易過程是:張三給李四轉賬指定金額。

啟動程式之前,我們需要使用原始碼工程中對應的sql指令碼建立相對應的資料庫和表,以及插入測試資料。

(1)首先我們要啟動registry-server服務註冊中心;

(2)然後進入seata服務端的bin資料夾,雙擊seata-server.bat檔案啟動;

(3)分別啟動seata-demo-bank1seata-demo-bank2微服務。

互動流程如下:

(1)請求bank1進行轉賬,傳入轉賬金額。

http://localhost:9011/bank1/transfer?amount=***
(2)bank1減少轉賬金額,通過feign呼叫bank2,傳入轉賬金額。

回滾流程省略前的rm註冊過程。

要點說明:

(1)每個rm使用datasourceproxy連線資料庫,其目的是使用connectionproxy,使用資料來源和資料連線**的目的就是在第一階段將undo_log和業務資料放在乙個本地事務提交,這樣就儲存了只要有業務操作就一定有

undo_log

(2)在第一階段undo_log中存放了資料修改前和修改後的值,為事務回滾作好準備,所以第一階段完成就已經將分支事務提交,也就釋放了鎖資源。

(3)tm開啟全域性事務開始,將xid全域性事務id放在事務上下文中,通過feign呼叫也將xid傳入下游分支事務,每個分支事務將自己的branch id分支事務id與xid關聯。

(4)第二階段全域性事務提交,tc會通知各個分支參與者提交分支事務,在第一階段就已經提交了分支事務,這裡各個參與者只需要刪除undo_log即可,並且可以非同步執行,第二階段很快可以完成。

(5)第二階段全域性事務回滾,tc會通知各個分支參與者回滾分支事務,通過 xid 和 branch id 找到相應的回滾日

志,通過回滾日誌生成反向的 sql 並執行,以完成分支事務回滾到之前的狀態,如果回滾失敗則會重試回滾操作。

@globaltransactional註解標註在全域性事務發起的service實現方法上,開啟全域性事務:globaltransactionalinterceptor會攔截@globaltransactional註解的方法,生成全域性事務id(xid),xid會在整個分布式事務中傳遞。在遠端呼叫時,spring-cloud-alibaba-seata會攔截feign呼叫將xid傳遞到下游服務。

@transactional

@globaltransactional

//開啟全域性事務

@override

public

void

updateaccountbalance

(string accountno, double amount)

", rootcontext.

getxid()

);//扣減張三的金額

accountinfodao.

updateaccountbalance

(accountno, amount *-1

);//呼叫李四微服務,轉賬

string transfer = bank2client.

transfer

(amount);if

("fallback"

.equals

(transfer))if

(amount ==2)

}

@transactional

@override

public

void

updateaccountbalance

(string accountno, double amount)

}

(1)張三向李四轉賬成功

http://localhost:9011/bank1/transfer?amount=1
(2)李四事務失敗,張三事務回滾成功

http://localhost:9011/bank1/transfer?amount=3
(3)張三事務失敗,李四事務回滾成功

分布式事務2PC協議

two phase commit protocol 在事務處理,資料庫,計算機網路中,兩階段提交 2pc 是一種原子提交協議。它是一種分布式演算法,協調參與分布式原子事務的所有程序,決定是提交事務還是中止 回滾 事務 它是一種協商一致性協議 該協議即使在許多臨時系統故障 包括程序 網路節點 通訊等故...

分布式場景之剛性事務 2PC詳解

分布式一致性 分布式場景下,多個服務同時對服務乙個流程,比如電商下單場景,需要支付服務進行支付 庫存服務扣減庫存 訂單服務進行訂單生成 物流服務更新物流資訊等。如果某乙個服務執行失敗,或者網路不通引起的請求丟失,那麼整個系統可能出現資料不一致的原因。上述場景就是分布式一致性問題,追根到底,分布式一致...

分布式場景之剛性事務 2PC詳解

分布式一致性 分布式場景下,多個服務同時對服務乙個流程,比如電商下單場景,需要支付服務進行支付 庫存服務扣減庫存 訂單服務進行訂單生成 物流服務更新物流資訊等。如果某乙個服務執行失敗,或者網路不通引起的請求丟失,那麼整個系統可能出現資料不一致的原因。上述場景就是分布式一致性問題,追根到底,分布式一致...