全部产品

接入单元化能力(仅专有云)

更新时间:2020-04-01 10:42:46

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

说明:该功能仅适用于专有云开启了单元化功能的用户。

DTX 服务配置

  1. 添加 maven 依赖:
    1. <dependency>
    2. <groupId>com.alipay.sofa</groupId>
    3. <artifactId>dtx-enterprise-sofa-boot-starter</artifactId>
    4. <version>${dtx.version}</version>
    5. </dependency>
  2. 服务配置:
    1. <bean id = "dtxService" class = "com.alipay.dtx.client.core.api.impl.DtxServiceImpl" />

发起方配置

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

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

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

  1. public class YourClass {
  2. public void yourMethod(yourParams){
  3. transactionTemplate.execute(new TransactionCallback() {
  4. @Override
  5. public Object doInTransaction(TransactionStatus status) {
  6. //开启分布式事务
  7. dtxService.start(bizType, bizId,userId, context)
  8. try{
  9. // 调用 TCC1 参与者一阶段try方法, 第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
  10. TCC1.try(userId, params1, null);
  11. // 调用 TCC2 参与者一阶段try方法,第一个参数是用户ID,try方法BusinessActionContext参数值传'null';
  12. TCC2.try(userId, params2, null);
  13. // 方法正常返回,事务提交
  14. }catch(Throwable t){
  15. // 出现异常,事务回滚
  16. throw t;
  17. }
  18. }
  19. });
  20. }
  21. }

发起方实现回查服务

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

  1. public class ActivityStateResolverImpl implements com.alipay.dtx.client.core.api.ActivityStateResolver {
  2. @Override
  3. public int isDone(String businessType, String businessId) {
  4. System.out.println("回查, businessType:"+businessType+", businessId" + businessId) ;
  5. return ActivityStateResolver.NOT_DONE|ActivityStateResolver.DONE;
  6. }
  7. }

回查服务配置成 spring bean:

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