文档

TCC 模式参与者

更新时间:

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

定义接口

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

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

public interface TccAction {
    @TwoPhaseBusinessAction(name = "yourTccActionName", commitMethod = "confirm", rollbackMethod = "cancel")
    public boolean try(
    BusinessActionContext businessActionContext, int a, int b);

    public boolean confirm(BusinessActionContext businessActionContext);

    public boolean 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)。

返回类型说明:

  • 二阶段的 Confirm 和 Cancel 方法的返回类型必须为 boolean 类型。

  • 一阶段的 Try 方法可以为 boolean 类型,也可以自定义返回值。

实现接口

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

public class TccActionImpl implements TccAction {
    @Override
    public boolean try(
    BusinessActionContext businessActionContext, int a, int b){

    }

    @Override
    public boolean confirm(BusinessActionContext businessActionContext) {

    }

    @Override
    public boolean cancel(BusinessActionContext businessActionContext) {

    }
}

各接口作用

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

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

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

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

发布服务

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

基于 SOFARPC 的服务发布

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

<bean id="tccActionImpl" class="com.xxx.xxx.TccActionImpl"/>
<sofa:service ref="tccActionImpl" interface="com.xxx.xxx.TccAction">
     <sofa:binding.tr/>
</sofa:service>

基于 Dubbo 的服务发布

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

<bean id="tccActionImpl" class="com.xxx.xxx.TccActionImpl"/>
<dubbo:service ref="tccActionImpl" interface="com.xxx.xxx.TccAction"/>

更多信息

TCC 参与者实现规范

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

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

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

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

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

  • 本页导读 (0)
文档反馈