分布式事務Saga (一) TCC vs Saga
分布式事務Saga(二)事務管理者SagaTransactionalAspect
分布式事務Saga(三)事務參與方管理SagaParticipantAspect
分布式事務Saga(四)事務恢復SagaRecoveryManager
項目地址:https://github.com/yangxb2010000/saga
回到PaymentServiceImpl的makePayment方法,方法體比較好理解,重點看下accountClient、inventoryClient的定義

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

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

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


基于上述SagaTransactionalAspect和SagaParticipativeAspect攔截器的實現(xiàn),就保證了所有事務參與方的操作和回滾操作都被持久化存儲了,無論任何時刻系統(tǒng)宕機,都可以基于持久化的日志對事務進行回滾操作,保證數(shù)據(jù)的最終一致性
事務回滾
其實上一篇已經(jīng)說過事務的提交和回滾邏輯了,這個地方再回過頭來看下,如果任何一個事務參與方返回失敗,如何實現(xiàn)事務的回滾操作,可以看下PaymentServiceImpl中的mockPaymentInventoryWithException方法

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

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