說完《分布式事務:解決方案之2pc理論》,我們現在就要在理論的基礎上實踐一把。
下面我們通過seata中介軟體實現分布式事務來模擬兩個賬戶的轉賬交易過程。交易過程是:張三給李四轉賬指定金額。
啟動程式之前,我們需要使用原始碼工程中對應的sql指令碼建立相對應的資料庫和表,以及插入測試資料。
(1)首先我們要啟動registry-server
服務註冊中心;
(2)然後進入seata服務端的bin資料夾,雙擊seata-server.bat
檔案啟動;
(3)分別啟動seata-demo-bank1
和seata-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詳解
分布式一致性 分布式場景下,多個服務同時對服務乙個流程,比如電商下單場景,需要支付服務進行支付 庫存服務扣減庫存 訂單服務進行訂單生成 物流服務更新物流資訊等。如果某乙個服務執行失敗,或者網路不通引起的請求丟失,那麼整個系統可能出現資料不一致的原因。上述場景就是分布式一致性問題,追根到底,分布式一致...