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 方法去确认并记录重试次数(重试一定次数不在重试)。 所以接口一定要保持幂等才行 这里特别注意
|