分布式事务支持以 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)