接入单元化能力

本文将引导您对本地分布式事务客户端进行改造,接入单元化能力。

说明

该功能仅适用于支持 LDC 单元化架构的环境。

DTX 服务配置

  1. 添加 Maven 依赖:

    <dependency>
          <groupId>com.alipay.sofa</groupId>
          <artifactId>dtx-enterprise-sofa-boot-starter</artifactId>
          <version>${dtx.version}</version>
    </dependency>
  2. 服务配置:

    <bean id="dtxService" class="com.alipay.dtx.client.core.api.impl.DtxServiceImpl"/>

发起方配置

发起方应用配置 spring 事务模板,配置示例如下:

<!--声明新的事务模板-->
<bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
        <property name="propagationBehaviorName">
               <value>PROPAGATION_REQUIRES_NEW</value>
        </property>
</bean>

在发起方的 spring 事务模板内,调用 dtxService.start(bizType, bizId, userId, context) 方法开启分布式事务(不再使用前文中 [@DtxTransaction](#) 注解的方式开启事务);其中参数 userId 会作为单元化架构下的路由参数,用作服务路由和数据库路由。

public class YourClass {

    public void yourMethod(yourParams) {

        transactionTemplate.execute(newTransactionCallback() {
            @Override
            public Object doInTransaction (TransactionStatus status){

                //开启分布式事务
                dtxService.start(bizType, bizId, userId, context)

                try {
                    // 调用 TCC1 参与者一阶段try方法, 第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
                    TCC1. try (userId,params1,null) ;

                    // 调用 TCC2 参与者一阶段try方法,第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
                    TCC2. try (userId,params2,null) ;

                    // 方法正常返回,事务提交
                } catch (Throwable t) {
                    // 出现异常,事务回滚
                    throw t;
                }
            }
        });
    }
}

发起方实现回查服务

当事务状态不确定时,dtxserver 需要通过回查服务询问发起方分布式事务状态,发起方需要实现 com.alipay.dtx.client.core.api.ActivityStateResolver 接口,在 isDone 方法中返回事务的状态(0 即未知,1 即提交,2 即回滚);

public class ActivityStateResolverImpl implements com.alipay.dtx.client.core.api.ActivityStateResolver {

    @Override
    public int isDone(String businessType, String businessId) {
        System.out.println("回查, businessType:" + businessType + ", businessId" + businessId);
        return ActivityStateResolver.NOT_DONE | ActivityStateResolver.DONE;
    }
}

回查服务配置成 spring bean:

<bean id="activityStateResolver" class="com.xxx.ActivityStateResolverImpl"/>