阻止併發下的產品超賣思路是利用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()//事務回滾
}
}