} //此番消耗仓库储存数据

堵住并发下的成品超卖思路是选取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()//事务回滚
}

 

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website