全部产品

TCC 模式参与者

更新时间:2021-01-20 13:45

分布式事务支持以 TCC 模式接入 SOFARPC 和 Dubbo 远程服务框架。本文将介绍如何定义接口、实现接口,并针对 SOFARPC 或 Dubbo 进行发布服务。

定义接口

TCC 参与者需要实现三个方法,分别是一阶段 Try 方法、二阶段 Confirm 方法以及二阶段 Cancel 方法。

在 TCC 参与者的接口中需要先加上 @TwoPhaseBusinessAction 注解(需引入 com.alipay.dtx.client.core.spi.TwoPhaseBusinessAction 包),并声明这个三个方法,如下所示:

publicinterfaceTccAction{
@TwoPhaseBusinessAction(name ="yourTccActionName", commitMethod ="confirm", rollbackMethod ="cancel")
publicbooleantry(BusinessActionContext businessActionContext,int a,int b);
publicboolean confirm(BusinessActionContext businessActionContext);
publicboolean cancel(BusinessActionContext businessActionContext);
}

@TwoPhaseBusinessAction 注解属性说明

  • name:TCC 参与者的名称,可自定义,但必须全局唯一。

  • commitMethod:指定二阶段 Confirm 方法的名称,可自定义。

  • rollbackMethod:指定二阶段 Cancel 方法的名称,可自定义。

TCC 方法参数说明

  • Try:第一个参数类型必须是 com.alipay.dtx.client.core.api.domain.BusinessActionContext,后续参数的个数和类型可以自定义。

  • Confirm:有且仅有一个参数,参数类型必须是 com.alipay.dtx.client.core.api.domain.BusinessActionContext,后续为相应的参数名(businessActionContext)。

  • Cancel:有且仅有一个参数,参数类型必须是 com.alipay.dtx.client.core.api.domain.BusinessActionContext,后续为相应的参数名(businessActionContext)。

返回类型说明Try、Confirm 和 Cancel 这三个方法的返回类型必须为 boolean 类型。

实现接口

TCC 接口实现支持用户自定义,实现类框架如下:

publicclassTccActionImplimplementsTccAction{
@Override
publicbooleantry(BusinessActionContext businessActionContext,int a,int b){

}
@Override
publicboolean confirm(BusinessActionContext businessActionContext){

}
@Override
publicboolean cancel(BusinessActionContext businessActionContext){

}
}

各接口作用

  • Try:初步操作。完成所有业务检查,预留必须的业务资源。

  • Confirm:确认操作。真正执行的业务逻辑,不作任何业务检查,只使用 Try 阶段预留的业务资源。因此,只要 Try 操作成功,Confirm 必定能成功。另外,Confirm 操作需满足幂等性,保证一笔分布式事务能且只能成功一次。

  • Cancel:取消操作。释放 Try 阶段预留的业务资源。同样的,Cancel 操作也需要满足幂等性。

关于 TCC 参与者的实现规范,查看 更多信息

发布服务

在完成接口定义与实现后,参与者还需要发布服务,才能被分布式事务的发起方远程调用,从而保证分布式场景下的数据一致性。

基于 SOFARPC 的服务发布

如果需要发布为 SOFARPC 服务,服务发布代码如下:

<beanid="tccActionImpl"class="com.xxx.xxx.TccActionImpl"/>

<sofa:serviceref="tccActionImpl"interface="com.xxx.xxx.TccAction">
<sofa:binding.tr/>
</sofa:service>

基于 Dubbo 的服务发布

如果需要发布为 Dubbo 服务,服务发布代码如下:

<beanid="tccActionImpl"class="com.xxx.xxx.TccActionImpl"/>

<dubbo:serviceref="tccActionImpl"interface="com.xxx.xxx.TccAction"/>

更多信息

TCC 参与者实现规范

  • 实现两阶段接口:二阶段入参只包含事务数据,参与者处理业务数据之前需要根据事务数据关联到具体的业务数据。

  • 控制业务幂等性:参与者需要支持同一笔事务的重复提交和重复回滚,保证一笔事务能且只能成功一次。

  • 数据可见性控制:当一笔分布式事务正在处理中,此时如果有查询,则需要兼容未处理完的中间数据的可见性。一般通过文案展示告诉用户中间数据的存在,例如告诉用户当前冻结的金额有多少。

  • 隔离性控制:对于状态类数据,需要提供隔离性控制来允许不同事务操作同一个业务资源。例如账户余额,不同事务操作的金额是隔离的。

  • 允许空回滚,拒绝空提交:回滚请求处理时,如果对应的具体业务数据为空,则返回成功。提交请求处理时,如果对应的具体业务数据为空,则返回失败。