当前位置:网站首页>Jd.com 2: how to prevent oversold in the deduction process of commodity inventory?

Jd.com 2: how to prevent oversold in the deduction process of commodity inventory?

2022-07-06 04:17:00 End code life

Click on “ End of life ”, Focus on , Official account , Daily technical dry goods , First time delivery !



In the process of commodity purchase , Inventory deduction process , The general operation is as follows :


  • select According to the goods id Query the inventory of goods .
  • According to the number of orders , Calculate whether the inventory is sufficient , If the inventory is insufficient, an exception of insufficient inventory will be thrown , If there is enough stock , Then subtract the deducted inventory to get the latest inventory residual value .
  • set Set the latest inventory remaining value .


The pseudo code of the above process is as follows :


      
      
// According to the goods id Get the remaining inventory of goods
select stock_remaing from stock_table where id=${goodsId};

// Operating inventory
// Compare inventory
if(stock_remaing <quantity){
// Throw the exception of insufficient inventory
}
else{
// Inventory value after deduction
int new_stock=stock_remaing - quantity;
}

// According to the goods id Set the calculated inventory
update stock_table set stock_remaing =${new_stock} id=${goodsId};
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.



1、 Concurrent modification of database storage oversold


If the isolation level of database transactions is not serialization (serializable), According to the characteristics of transactions , During concurrent modification , Write overwrite may occur .


hypothesis , Remaining inventory of goods stock_remaing by 100, Customer A Place an order 20, Customer B Place an order 30, When deducting inventory concurrently , There may be oversold . If the customer A And the customer B At the same time, the remaining inventory is 100, The value submitted after the transaction will overwrite the value submitted by the previous customer , It is possible that the remaining inventory is 80 perhaps 70. The process is as follows :


 Two sides of Jingdong : Deduction process of commodity inventory , How to prevent oversold ?_redis



2、 Lock update Repository


In order to control transactions , Prevent write overwrite , You'll think of using select for update The way , Lock the inventory of this commodity , Then do the rest .


The process is as follows :


 Two sides of Jingdong : Deduction process of commodity inventory , How to prevent oversold ?_ Pseudo code _02


above , Use pessimistic locking , In distributed services , If concurrency is high , Stock deduction is a serial operation , Efficiency is very low .



3、 Update with optimistic lock


At the time of the update , Use (CAS+ Version number update )+ Retry conditions ( Number of retries or retry time limit ) Update inventory in an optimistic way . here , If , Customer A And the customer B At the same time, the remaining inventory is read 100, At the time of the update , One operation will fail . The process is as follows :


 Two sides of Jingdong : Deduction process of commodity inventory , How to prevent oversold ?_ database _03


This method can greatly improve the concurrency , It can also ensure the consistency of data ; It is controlled by the conditions of retry times and retry time , It can prevent the database pressure caused by too many retries .



4、 Can it be executed by direct decrement ?


When deducting inventory , Some people propose not to implement select, Calculation ,set Three stage operation , The way of direct deduction , And make a judgment when the deduction is less than zero . The pseudocode is as follows :


      
      
update stock_table set remaing_stock=remaing_stock-${quantity}
where id = goods id
and remaing_stock>${quantity};
  • 1.
  • 2.
  • 3.


In a distributed service call , Because the network is abnormal , Get server exception , Maybe when the microservice is invoked , There is a service retry . for example , Gateway timeout for scenario , Service retry mechanism . here , This method does not satisfy idempotency , And there are many deductions . for example , When the same user deducts inventory , Service retry , In extreme cases , The user has performed inventory deduction for multiple times , Then there is oversold .



5、 have access to redis Do you want to deduct inventory ?


Because I haven't studied redis Source code , For this way, I refer to Daniel's reply , The answer is that you can use redis Transaction deduction balance of , But in CAS Mechanism ratio mysql No advantage , High performance is due to its memory storage , The side effect is the risk of data loss .


PS: Prevent missing this article , You can like it , It's easy to browse and search . 

原网站

版权声明
本文为[End code life]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/02/202202132234361781.html

随机推荐