Hibernate中executeUpdate的缓存问题

在处理业务逻辑时,涉及Hibernate的executeUpdate方法修改product_sale_stock和pss_total_stock表,但发现数据完整性未得到保持。原因是executeUpdate虽执行了HQL,但在一级缓存中未更新数据,导致后续查询仍获取到旧值。解决方案是将第三步的HQL查询改为SQL查询,以确保数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

业务场景
在单据处理服务中需要处理以下业务逻辑:
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查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值