全部产品
云市场

TCC 模式参与者

更新时间:2020-03-13 12:29:40

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

定义接口

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

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

  1. public interface TccAction {
  2. @TwoPhaseBusinessAction(name = "yourTccActionName", commitMethod = "confirm", rollbackMethod = "cancel")
  3. public boolean try(BusinessActionContext businessActionContext, int a, int b);
  4. public boolean confirm(BusinessActionContext businessActionContext);
  5. public boolean cancel(BusinessActionContext businessActionContext);
  6. }

@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,后续为相应的参数名。
  • Cancel:有且仅有一个参数,参数类型必须是 com.alipay.dtx.client.core.api.domain.BusinessActionContext,后续为相应的参数名。

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

实现接口

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

  1. public class TccActionImpl implements TccAction{
  2. @Override
  3. public boolean try(BusinessActionContext businessActionContext, int a, int b){
  4. }
  5. @Override
  6. public boolean confirm(BusinessActionContext businessActionContext){
  7. }
  8. @Override
  9. public boolean cancel(BusinessActionContext businessActionContext){
  10. }
  11. }

各接口作用

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

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

发布服务

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

基于 SOFARPC 的服务发布

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

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

基于 Dubbo 的服务发布

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

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

更多信息

TCC 参与者实现规范

  • 实现两阶段接口:二阶段入参只包含事务数据,参与者处理业务数据之前需要根据事务数据关联到具体的业务数据。
  • 控制业务幂等性:参与者需要支持同一笔事务的重复提交和重复回滚,保证一笔事务能且只能成功一次。
  • 数据可见性控制:当一笔分布式事务正在处理中,此时如果有查询,则需要兼容未处理完的中间数据的可见性。一般通过文案展示告诉用户中间数据的存在,例如告诉用户当前冻结的金额有多少。
  • 隔离性控制:对于状态类数据,需要提供隔离性控制来允许不同事务操作同一个业务资源。例如账户余额,不同事务操作的金额是隔离的。
  • 允许空回滚,拒绝空提交:回滚请求处理时,如果对应的具体业务数据为空,则返回成功。提交请求处理时,如果对应的具体业务数据为空,则返回失败。