事务用户指南
基础的使用方式在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")@RequiredArgsConstructorpublic 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")@RequiredArgsConstructorpublic 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的执行结果就会出现一个中间状态,产生业务上非预期的数据。