更新时间:2020-12-11 12:07
本文将引导您对本地分布式事务客户端进行改造,接入单元化能力。
<dependency>
<groupId>com.alipay.sofa</groupId>
<artifactId>dtx-enterprise-sofa-boot-starter</artifactId>
<version>${dtx.version}</version>
</dependency>
<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(new TransactionCallback() {
@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" />
在文档使用中是否遇到以下问题
更多建议
匿名提交