欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

处理产品超卖的一种思路(来讨论讨论)

程序员文章站 2022-04-20 12:09:13
阻止并发下的产品超卖思路是利用redis串行处理数据,但又有高并发处理数据的能力 产品表(product) class Product { public int Id{get;set} //自增Id public string Name{get;set}//产品名称 public int Numbe ......

阻止并发下的产品超卖思路是利用redis串行处理数据,但又有高并发处理数据的能力

产品表(product) 

class Product

{

  public int Id{get;set} //自增Id

       public string Name{get;set}//产品名称

       public int Number{get;set}//库存

       public DateTime NTime{get;set;}//库存同步时间

       ....

}

库存变更记录表(productNumberRecord)

class productNumberRecord

{

  public int Id{get;set;}

       public int Number{get;set;} //本次消耗库存数量

       public int SurplusNumber{get;set} //本次消耗后的剩余数量

       public DataTime Time{get;set;} //记录时间

       ....

}

1.将产品Id,库存存入redis,每次操作产品库存,则产生一条库存的变更记录存入sql库中

2.此时sql库产品的实际库存应该是 库存=库存-库存记录(大于NTime时间的记录)

3.sql库中的余额,可以做定时任务 按天或小时数进行同步,防止过大的记录造成select超时

4.如果redis挂掉,那么它将从数据库中 按照步揍2的方式同步库存

 

伪代码实现(不加锁)

(开始事务){

try{

func1(插入变更记录表);
如果func1 执行失败 直接跳出

func3 ...

func4 ...

等其他业务

funcX(增减redis库存)
如果funcX执行失败,直接跳出,不插入日志

如果都成功 则提交事务

catch{
tran.callback()//事务回滚
}