ByteTCC 源码分析 - 事务流程 - 事务回滚及提交

275 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天


在completeTransactionAfterThrowing()方法中,调用已经try成功的各个服务的cancel的接口。

ByteTCC框架提供一个内置的org.bytesoft.bytetcc.supports.springcloud.controller.CompensableCoordinatorController控制器调用cancel接口。


在一个分布式事务中,对应的bytejta表里,一定会有两条记录: 第一条记录:如果服务执行了try接口之后,就会有一条记录。如果只有一条记录,就说明这个事务一定没有执行完整。必须有两条记录。 第二条记录:代表的是confirm或者是cancel。这个分布式事务才算是结束了。


分布式事务子事务异常需要回滚,子事务本地事务回滚且反馈给主事务调度所有子事务回滚。主事务调度之前也会回滚主事务的本地事务。


org.bytesoft.bytetcc.CompensableTransactionImpl#fireRemoteParticipantCancel

classDiagram
class CompensableTransactionImpl
CompensableTransactionImpl:-List<XAResourceArchive> resourceList 

resourceList:就是按照调用顺序,如果你调用了一个服务,ByteTCC分布式事务框架,会将分布式事务中调用的其他服务作为一个resource放到一个resourceList中去,分布式事务中调用的服务的具体状态是成功还是失败,都可以感知到。

如果所有服务都try成功了,只要依次对这些服务调用confirm接口就可以了。

但是如果一个分布式事务中要调用5个服务,结果只有2个服务调用成功了,第3个服务调用失败了,在进行cancel的时候,只要对try成功的服务执行cancel就可以了。


org.bytesoft.bytetcc.supports.springcloud.SpringCloudCoordinator#invoke

classDiagram
InvocationHandler <|-- SpringCloudCoordinator

class SpringCloudCoordinator{
+invoke(Object proxy, Method method, Object[] args) Object
}

负责基于RestTemplate组件调用cancel接口


拼接出来一个针对子事务的微服务的cancel接口调用的请求URL,使用RestTemplate来发送请求,会去请求子事务所在微服务里的ByteTCC内置的CompensableController,带过去一个xid,分布式事务id,子事务内部的ByteTCC controller就可以根据分布式事务id,执行对应的cancel操作。


org.bytesoft.bytetcc.CompensableTransactionImpl#fireNativeParticipantCancel

负责执行Cancel Bean的逻辑