业务需要,需要用Java写一个实物,多个sql一起要么都执行,要么都不执行,写法如下,记录一下。
首先,在Springboot的启动类,或者某个@Configuration的类上加上@EnableTransactionManagement
开启事务。
Conntrol
/**
* @Description:下发立体库出库计划(事务)
* @Param: [id]
* @return: java.util.List<org.muyuan.slaughter.workshop.convertApi.vo.threeStage.store.MySpLiTiKuOrderStatusVO>
* @Author: 孟海鹏
* @Date: 2022/9/18
*/
@ApiOperation(value = "立体库出库计划(三代)(下发立体库出库计划)")
@GetMapping("/UpdateLiTiKuHouseOutPlanStatus")
public R UpdateLiTiKuHouseOutPlanStatus(@NotEmpty String issuer, @NotEmpty String issueDate, @NotEmpty String outPlanNo) {
mySpLitikuhouseoutplanService.updateLiTiKuHouseOutPlanStatus(issuer, issueDate, outPlanNo);
return R.success("下发成功!");
}
Services
只要在需要使用事务的方法上加上@Transactional
这里事务分为2步,第一步先根据where条件判断是否满足更新条件,若不满足直接用throw new RuntimeException抛出异常,自动执行回滚操作。若满足之后再执行第二步更新操作。
/**
* @Description: 下发立体库出库计划(事务)
* @Param: [FIssuer, FIssueDate, FOutPlanNo]
* @return: java.util.List<org.muyuan.slaughter.workshop.convertApi.vo.threeStage.store.MySpLiTiKuHouseOutPlanStatusVO>
* @Author: 孟海鹏
* @Date: 2022/9/18
*/
@Transactional
public void updateLiTiKuHouseOutPlanStatus(String issuer, String issueDate, String outPlanNo) {
//1.先校验是否有满足更新条件的数据
List<MySpLitikuhouseoutplanEntity> entities = baseMapper.selectList(Wrappers.<MySpLitikuhouseoutplanEntity>query().lambda()
.eq(MySpLitikuhouseoutplanEntity::getOutPlanNo, outPlanNo)
.eq(MySpLitikuhouseoutplanEntity::getDeleteStatus, CommonConstant.STATUS_INIT));
if (CollectionUtils.isEmpty(entities)) throw new RuntimeException("下发失败");
List<String> ids = entities.stream().map(MySpLitikuhouseoutplanEntity::getId).collect(Collectors.toList());
List<MySpLitikuhouseoutplanDetailEntity> detailEntities = litikuhouseoutplanDetailMapper.selectList(Wrappers.<MySpLitikuhouseoutplanDetailEntity>query().lambda()
.eq(MySpLitikuhouseoutplanDetailEntity::getDeleteStatus, CommonConstant.STATUS_INIT)
.in(MySpLitikuhouseoutplanDetailEntity::getInterID, ids));
if (CollectionUtils.isEmpty(detailEntities)) throw new RuntimeException("下发失败");
List<TBusinessAsrsOutbillEntity> asrsOutbillEntities = businessAsrsOutbillMapper.selectList(Wrappers.<TBusinessAsrsOutbillEntity>query().lambda()
.eq(TBusinessAsrsOutbillEntity::getOutBillNo, outPlanNo)
.eq(TBusinessAsrsOutbillEntity::getSyncStatus, CommonConstant.DATE_DEL));
if (CollectionUtils.isEmpty(asrsOutbillEntities)) throw new RuntimeException("下发失败");
//2.更新状态
baseMapper.UpdateLiTiKuHouseOutPlanStatus(issuer, issueDate, outPlanNo);
baseMapper.UpdateLiTiKuHouseOutPlanStatus2(issuer, issueDate, outPlanNo);
baseMapper.UpdateLiTiKuHouseOutPlanStatus3(issuer, issueDate, outPlanNo);
}
Mapper
/**
* @Description:下发立体库出库计划-sql1(事务)
* @Param: [FIssuer, FIssueDate, FOutPlanNo]
* @return: java.util.List<org.muyuan.slaughter.workshop.convertApi.vo.threeStage.store.MySpLiTiKuHouseOutPlanStatusVO>
* @Author: mhp
* @Date: 2022/9/18
*/
Integer UpdateLiTiKuHouseOutPlanStatus(String issuer, String issueDate, String outPlanNo);
/**
* @Description: 下发立体库出库计划-sql2(事务)
* @Param: [issuer, issueDate, outPlanNo]
* @return: java.lang.Integer
* @Author: mhp
* @Date: 2022/9/29
*/
Integer UpdateLiTiKuHouseOutPlanStatus2(String issuer, String issueDate, String outPlanNo);
/**
* @Description: 下发立体库出库计划-sql3(事务)
* @Param: [issuer, issueDate, outPlanNo]
* @return: java.lang.Integer
* @Author: mhp
* @Date: 2022/9/29
*/
Integer UpdateLiTiKuHouseOutPlanStatus3(String issuer, String issueDate, String outPlanNo);
XML
<update id="UpdateLiTiKuHouseOutPlanStatus">
update MY_SP_LiTikuHouseOutPlan set
FCheck=1,
exchange_status=0,
FIssuer= #{issuer},
FIssueDate=#{issueDate}
where FOutPlanNo=#{outPlanNo} and FDelete=0;
</update>
<update id="UpdateLiTiKuHouseOutPlanStatus2">
update MY_SP_LiTikuHouseOutPlan_Detail set
FCheck=1,
exchange_status=0
where FInterID in(select FID from MY_SP_LiTikuHouseOutPlan where FOutPlanNo=#{outPlanNo} and FDelete=0);
</update>
<update id="UpdateLiTiKuHouseOutPlanStatus3">
update t_business_asrs_outbill set
exchange_status=0,
sync_status=0
where out_bill_no=#{outPlanNo} and sync_status=-1;
</update>