库存水平为负

2020-08-31 20:28发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在我们的项目中,我们维护产品的库存水平。 我在特定情况下正面临一个问题,其在下面提到-

我将产品A的库存设置为3,现在有两个不同的用户(假设用户A和用户B)在购物车中添加了2数量的产品A。 由于尚未预留库存,因此双方都可以向其购物车中添加数量2,因此当两个用户同时进入付款页面时,结果库存水平达到-1(负)订单,这两个用户都成功下达了订单。

理想情况下,一旦其中一个用户保留了它,就不应允许其他用户继续进行qty 2。

有人可以在这个问题上建议或建议我吗? 如何预防这种情况?

我无法在本地复制此问题,但在生产环境中很少发生。

先谢谢了。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


嗨,

在我们的项目中,我们维护产品的库存水平。 我在特定情况下正面临一个问题,其在下面提到-

我将产品A的库存设置为3,现在有两个不同的用户(假设用户A和用户B)在购物车中添加了2数量的产品A。 由于尚未预留库存,因此双方都可以向其购物车中添加数量2,因此当两个用户同时进入付款页面时,结果库存水平达到-1(负)订单,这两个用户都成功下达了订单。

理想情况下,一旦其中一个用户保留了它,就不应允许其他用户继续进行qty 2。

有人可以在这个问题上建议或建议我吗? 如何预防这种情况?

我无法在本地复制此问题,但在生产环境中很少发生。

先谢谢了。

付费偷看设置
发送
6条回答
My梦
1楼-- · 2020-08-31 20:58

OOB功能没有任何验证来检查库存。 但是,如果我们有这样的要求,请再次在结帐页面上。 在下订单流程之前。 我们将不得不检查库存状态并停止用户。

我已经看到在多个应用程序中,我们在下订单按钮之前先进行验证。

我希望这可以澄清。

shere_lin
2楼-- · 2020-08-31 21:08

正确。 您需要打电话进行软库存预定,以检查库存并进行储备。

Violet凡
3楼-- · 2020-08-31 21:07

:我假设您在购物车页面上有一个继续结帐按钮。 该按钮的动作应为/cart/checkout。 如果这样做,则用户单击此按钮后,您的调用将转到CartPageController中的以下方法。

  @RequestMapping(value ="/img/checkout",方法= RequestMethod.GET)
      @RequireHardLogIn
      公共字符串cartCheck(final RedirectAttributes redirectModel)引发CommerceCartModificationException
      {
          SessionOverrideCheckoutFlowFacade.resetSessionOverrides();
 
          如果(!getCartFacade()。hasEntries())
          {
              LOG.info("缺少或清空购物车");
 
             //没有会话购物车或空会话购物车。 弹回购物车页面。
              GlobalMessages.addFlashMessage(redirectModel,GlobalMessages.ERROR_MESSAGES_HOLDER," basket.error.checkout.empty.cart",
                      空值);
              返回REDIRECT_CART_URL;
          }
 
 
          如果(validateCart(redirectModel))
          {
              GlobalMessages.addFlashMessage(redirectModel,GlobalMessages.ERROR_MESSAGES_HOLDER,CART_CHECKOUT_ERROR,null);
              返回REDIRECT_CART_URL;
          }
 
         //重定向到结帐流程的开始以开始结帐流程
         //我们只重定向到通用的'/checkout'页面,该页面实际上将选择结帐流程
         //使用。 客户不一定是根据此请求登录的,但将被迫登录
         //当他们到达"/结帐"页面时。
          返回REDIRECT_PREFIX +"/img/checkout";
      }

  

此功能检查购物车是否为空。 此功能会将用户重定向回购物车页面。 还有另一个if块,用于检查购物车是否有效 if(validateCart(redirectModel))。 该validateCart函数将检查购物车是否已修改或添加的产品库存是否已更改。 如果这样做,它将在redirectModel中存储适当的消息,将用户重定向回购物车页面,并在页面顶部以Flash消息形式显示适当的消息。 简而言之,在您的情况下,在用户A和用户B之间,谁先单击 Proce to Checkout 按钮,将被带到结帐页面,另一个将被重定向回购物车页面,并显示一条消息,提示 >您的购物车已调整。

希望有帮助。

CPLASF-自律
4楼-- · 2020-08-31 21:09

我讨厌这样说,但是如果存在竞争条件,那么最好使用并发。 使用同步或锁定。

何必丶何苦呢
5楼-- · 2020-08-31 21:10

问题在于OOTB Hybris通过jdbcTemplate(请参见DefaultStockLevelDao)与StockLevels配合使用。 请调整DefaultStockLevelDao并重写其查询。例如,此查询在stockService#reserve期间执行:
UPDATE库存水平SET p_reserved = p_reserved-吗? WHERE PK =?
可以用以下方式替换:
更新库存水平SET p_reserved = GREATEST(0,p_reserved-?)WHERE PK =?

我还要提到的是,由于直接更新数据库行,针对具体模型,修改时间不会更改。 因此,也应该对其进行调整。

渐行渐远_HoldOn
6楼-- · 2020-08-31 21:08

您不应使用模型的设置方法手动更新库存,这会导致并发问题。 甚至prod和QA服务器都将具有群集,并且可以在那里并行运行这些逻辑。 因此,切勿使用setter方法更新库存模型。

使用StockService(接口)方法更新或保留库存。 此服务将锁定Stock模型对象,其他要使用同一对象的线程将在第一次事务完成后处于等待模式。

当我们对下订单进行验证时,一个用户下了订单,第二个用户下了错误,无法下订单

一周热门 更多>