跳转到内容

事务用户指南

基础的使用方式在DataStore事务概述文章中已经描述过,核心就是在需要事务的业务逻辑上加一个@DSTransaction注解声明

1. 最佳实践

1.1 Flow/Function

1.1.1 接口定义上不需要声明事务(声明了也无效)

更新活动Flow声明

@Flow(name = "Update campaign")
public interface UpdateCampaignFlow {
CampaignBO execute(CampaignBO campaignBO);
}

更新活动Function声明

@Function(name = "Update Campaign")
public interface UpdateCampaignFunc {
CampaignBO execute(CampaignBO campaignBO);
}

1.1.2 实现上主动声明事务

更新活动Flow实现

@FlowImpl(name = "Update campaign")
@RequiredArgsConstructor
public class UpdateCampaignFlowImpl implements UpdateCampaignFlow {
private final ValidateCampaignFunc validateCampaignFunc;
private final UpdateCampaignFunc updateCampaignFunc;
private final ValidateUpdateCampaignFunc validateUpdateCampaignFunc;
private final OrganizationContext organizationContext;
@DSTransaction
@Override
public CampaignBO execute(CampaignBO campaignBO) {
if (Objects.isNull(campaignBO.getEntity())) {
final EntityBO entityBO = organizationContext.getEntity();
campaignBO.setEntity(entityBO);
}
validateCampaignFunc.execute(campaignBO);
validateUpdateCampaignFunc.execute(campaignBO);
final CampaignBO updatedCampaign = updateCampaignFunc.execute(campaignBO);
return updatedCampaign;
}
}

更新活动Function实现

@FunctionImpl(name = "Update Campaign")
@RequiredArgsConstructor
public class UpdateCampaignFuncImpl implements UpdateCampaignFunc {
@DSTransaction
@Override
public CampaignBO execute(CampaignBO campaignBO) {
if (!Objects.isNull(campaignBO.getCampaignFlowDefinition())) {
if (!Objects.isNull(campaignBO.getCampaignFlowDefinition().getId())) {
BooleanResult updateResult = DS.update(campaignBO.getCampaignFlowDefinition());
if (!updateResult.getValue()) {
throw new BusinessException("update campaignFlowDefinition fail");
}
} else {
IntResult createResult = DS.create(campaignBO.getCampaignFlowDefinition());
campaignBO.setCampaignFlowDefinition(DS.findById(CampaignFlowDefinitionBO.class, createResult.getValue().longValue()));
}
}
DS.update(campaignBO);
return DS.findOne(CampaignBO.class, "*," + "campaignFlowDefinition.*", "id=?", campaignBO.getId());
}
}

如果没有声明事务,可能出现预期外的结果,比如上面的更新活动Function,DS.create(campaignBO.getCampaignFlowDefinition())成功,但是DS.update(campaignBO);时候失败了,这时候这个function的执行结果就会出现一个中间状态,产生业务上非预期的数据。