业务场景
在单据处理服务中需要处理以下业务逻辑:
1:修改product_sale_stock中商品在对应仓库的实物库存stock与销售占用sales
2:修改pss_total_stock中商品的总可用库存availableQuantity
3:product_sale_stock与pss_total_stock需要保持数据的完整性
代码实现
@Override
public void documentsProcessing(Long productSale,Long dc, int stock,int sales){
//第一步 hql 查询
ProductSaleStockVo productSaleStockVo = productSaleStockService.queryProductSaleStockPo(productSale, dc);
//第二步 修改product_sale_stock中商品在对应仓库的实物库存stock与销售占用sales
//hql更新 @Query(value="update ProductSaleStockPo set stock=?,sales=? where id=?",executeUpdate = true)
productSaleStockDao.updateStockAndSales(stock,sales,productSaleStockVo.getId());
//第三步 hql查询
List<ProductSaleStockVo> productSaleStockVos=productSaleStockService.findByProductSale(productSale);
//计算当前商品的总可用库存
int totalAvailableQuantity=0;
for(ProductSaleStockVo vo :productSaleStockVos){
int AvailableQuantity=vo.getStock()-vo.getSales();
totalAvailableQuantity+=AvailableQuantity;
}
//第四步 修改pss_total_stock中商品的总可用库存totalAvailableStock
//hql更新 @Query(value = "update TotalStockPo set availableQuantity=? where id=? ",executeUpdate = true)
totalStockDao.updateAvailableQuantity(totalAvailableQuantity,productSale);
}
单元测试当前服务
@Test
public void testUpdateStock() {
stockDocumentsService.documentsProcessing(1201414652L,110008L,50,5);
}
执行SELECT * FROM product_sale_stock where productsale=1201414652
查看product_sale_stock中修改后的数据库
执行SELECT * FROM product_sale_stock where productsale=1201414652
查看 pss_total_stock中修改后的数据库
结论与原因分析
product_sale_stock与pss_total_stock没有保持数据的完整性
因为在第二步操作中 executeUpdate不会更改一级缓存的数据,虽然是执行的hql,但是底层又被转换为了sql去执行,所以导致第三步中查询出来的数据是修改以前的数据。
如何优化代码
把第三步的hql查询调整为sql查询