分布式事務Saga(三)事務參與方管理SagaParticipantAspect

分布式事務Saga (一) TCC vs Saga
分布式事務Saga(二)事務管理者SagaTransactionalAspect
分布式事務Saga(三)事務參與方管理SagaParticipantAspect
分布式事務Saga(四)事務恢復SagaRecoveryManager

項目地址:https://github.com/yangxb2010000/saga

回到PaymentServiceImpl的makePayment方法,方法體比較好理解,重點看下accountClient、inventoryClient的定義


image.png

AccountClient.payment是spring-cloud的rpc調(diào)用,在接口定義上添加了@SagaParticipative注解,該注解可以實現(xiàn)把當前rpc操作作為事務參與方添加到事務中


image.png

@SagaParticipative注解的攔截代碼實現(xiàn)
image.png

SagaParticipativeInterceptor負責具體的攔截工作,核心邏輯就是構(gòu)建Participant,并添加到當前事務中


image.png

image.png

基于上述SagaTransactionalAspect和SagaParticipativeAspect攔截器的實現(xiàn),就保證了所有事務參與方的操作和回滾操作都被持久化存儲了,無論任何時刻系統(tǒng)宕機,都可以基于持久化的日志對事務進行回滾操作,保證數(shù)據(jù)的最終一致性

事務回滾

其實上一篇已經(jīng)說過事務的提交和回滾邏輯了,這個地方再回過頭來看下,如果任何一個事務參與方返回失敗,如何實現(xiàn)事務的回滾操作,可以看下PaymentServiceImpl中的mockPaymentInventoryWithException方法

image.png

上圖中位置會拋出異常,異常會被
SagaTransactionalInterceptor.interceptor捕獲到,該位置會執(zhí)行事務的回滾邏輯

image.png

上圖中的回滾操作最終會調(diào)用每一個已執(zhí)行的參與方的cancel方法,看下具體調(diào)用實現(xiàn)

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容