态度决定一切

0%

tcc-traction源码阅读笔记

tcc-trancation 分布式事务框架源码阅读

TCC的异常场景及应对机制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
1>com.roncoo.pay.service.trade.biz.impl.RpTradePaymentManagerBizImpl#completeSuccessOrder 银行返回订单支付成功,后调支付成功,还未执行方法,被拦截器拦截
2>org.mengyun.tcctransaction.interceptor.CompensableTransactionInterceptor#interceptCompensableMethod 进入可事务补偿拦截器
3>org.mengyun.tcctransaction.utils.CompensableMethodUtils#calculateMethodType 判断当前执行者类型 MethodType.ROOT
4>org.mengyun.tcctransaction.interceptor.CompensableTransactionInterceptor#rootMethodProceed 主事务方法的处理
5>org.mengyun.tcctransaction.TransactionManager#begin 事务开始(创建事务日志记录,并将该事务日志记录存入当前线程的事务局部变量中) TransactionType.ROOT
6>org.aspectj.lang.ProceedingJoinPoint#proceed() Try (开始执行被拦截的方法,或进入下一个拦截器处理逻辑) ,执行完毕等待返回....
7>org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#interceptTransactionContextMethod 资源拦截器,拦截事务上下文方法
8>org.mengyun.tcctransaction.TransactionManager#getCurrentTransaction 获取当前事务,没有则新建事务(trying状态)
9>org.mengyun.tcctransaction.utils.CompensableMethodUtils#calculateMethodType 判断当前执行者类型(ROOT)
10>org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#generateAndEnlistRootParticipant
生成和登记根参与者Participant(Participant保存确认方法和确认方法的实例) 加入到参与者列表,更新事务信息(加入了事务参与者,包含了触发confirm或cancel方法的参数信息)
11>org.aspectj.lang.ProceedingJoinPoint#proceed(java.lang.Object[]) 开始执行被拦截的方法,或进入下一个拦截器处理逻辑
12>com.roncoo.pay.service.trade.biz.impl.RpTradePaymentManagerBizImpl#completeSuccessOrder 真正进入到方法内部执行 修改支付记录状态, 修改支付订单状态
13>com.roncoo.pay.service.account.api.RpAccountTransactionService#creditToAccountTcc 调用给商户资金帐户加款(平台收款) try 方法,调用参与者账户资金系统加款,调用之前被拦截器拦截
14>org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#interceptTransactionContextMethod 获取当前事务,从当前线程 threadLocal 中可以获取到事务
15>org.mengyun.tcctransaction.utils.CompensableMethodUtils#calculateMethodType 判断当前执行者类型,MethodType.CONSUMER
16>org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#generateAndEnlistConsumerParticipant 生成并登记消费者的参与者Participant
服务接口的 TransactionContext 参数设值(新的事务分支ID),状态为当前transaction状态TRYING ,构建事务confirm上下文和构建事务cancle上下文
17>org.aspectj.lang.ProceedingJoinPoint#proceed(java.lang.Object[]) 继续执行 方法
18> com.roncoo.pay.service.account.api.RpAccountTransactionService#creditToAccountTcc 回到方法执行 try 方法,发起远程调用
19>com.roncoo.pay.service.account.aip.impl.RpAccountTransactionServiceImpl#creditToAccountTcc 到了资金账户系统 provider 方真正执行方法
20>org.mengyun.tcctransaction.interceptor.CompensableTransactionInterceptor#interceptCompensableMethod 被可补偿事务拦截器拦截
21>org.mengyun.tcctransaction.utils.CompensableMethodUtils#calculateMethodType 判断当前执行方的类型,MethodType.PROVIDER
22>org.mengyun.tcctransaction.interceptor.CompensableTransactionInterceptor#providerMethodProceed 服务提供者事务方法处理. 当前分支事务状态为TRYING
基于全局事务ID扩展创建新的分支事务,并存于当前线程的事务局部变量中.
23>org.aspectj.lang.ProceedingJoinPoint#proceed()开始执行被拦截的方法,或进入下一个拦截器处理逻辑
24> org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#interceptTransactionContextMethod 进入到资源协调拦截器
25>org.mengyun.tcctransaction.utils.CompensableMethodUtils#calculateMethodType 判断当前类型为PROVIDER
26>org.mengyun.tcctransaction.interceptor.ResourceCoordinatorInterceptor#generateAndEnlistProviderParticipant 生成并登记服务提供者的参与者
构建确认方法的提交上下文,构建取消方法的提交上下文 加入参与者列表更新本地缓存
27>org.aspectj.lang.ProceedingJoinPoint#proceed(java.lang.Object[]) 开始执行被拦截的方法,或进入下一个拦截器处理逻辑
28>com.roncoo.pay.service.account.aip.impl.RpAccountTransactionServiceImpl#creditToAccountTcc 开始真正执行账户资金系统的 try 方法
29>com.roncoo.pay.service.trade.biz.impl.RpTradePaymentManagerBizImpl#completeSuccessOrder 账户资金加款成功,回到completeSuccessOrder方法继续执行
30>com.roncoo.pay.service.point.api.RpPointAccountService#creditToPointAccountTcc client调用被拦截 过程和 13 ~ 29 过程一样
.
.
.
>com.roncoo.pay.service.point.api.RpPointAccountService#creditToPointAccountTcc rpc 执行完毕返回
> org.aspectj.lang.ProceedingJoinPoint#proceed() 执行完毕回到 步骤 6
>org.mengyun.tcctransaction.TransactionManager#commit Try检验正常后提交(try 方法过程中如果出现异常或调用org.mengyun.tcctransaction.TransactionManager#rollback 火锅就是遍历事务参与者这列表中的 cancle 方法)(事务管理器在控制提交):Confirm
>org.mengyun.tcctransaction.Transaction#commit 遍历调用事务参与者列表的 commit 方法
>org.mengyun.tcctransaction.Participant#commit
>org.mengyun.tcctransaction.Terminator#invoke confirmInvocationContext 调用之前写入的 confirm 上线文直接执行各个参与者的 confirm 方法
>org.mengyun.tcctransaction.TransactionRepository#delete confirm 完成后会调用事务删除方法删除日志,这里注意如果 confirm 失败了导致日志没有删除,会有个事务调度系统TransactionRecovery 定时的检索出为被删除的事务数据然后一直调用 confirm 方法去确认并记录重试次数(重试一定次数不在重试)。
所以接口一定要保持幂等才行 这里特别注意