因併發造成建立了2條相同訂單解決的方法

2021-07-30 06:51:06 字數 1163 閱讀 2695

在訂單的建立和支付系統時,會有檢查邏輯是否已經簽約。如果查到某個客戶與某個投資顧問的投顧服務產品已經有簽約關係,則不允許重複簽約。但是qa反應,因目前客戶端可以多終端登陸,qa反應當兩個終端同時間提交同一訂單時,會對同一產品生成2個訂單。

為了避免在同一時間的2個請求生成2個訂單,可以通過redis快取乙個lockkey來生成乙個鎖。基本思路為:

在開始建立訂單前,在redis中快取乙個由客戶號clientid+投資顧問adviserid+名下產品productid的 lockey值,建立訂單完成後,刪除該lockkey值。這樣,每次建立訂單前先查詢 該 「客戶號clientid+投資顧問adviserid+名下產品productid」 對應的lockey值在快取中是否存在,如果存在說明有正在建立中的訂單,直接返回。

string lockkey = cachekeys.genclientadviserproductconfirmkey(crmauth.getclientid(), string.valueof(adviserid), productid);//拼接key值

//檢測該訂單對應的lockkey值是否存在,存在則返回,不存在則在快取中快取lockkey,並開始往下執行訂單建立

if(lockservice.checkrepeat(lockkey))

//執行訂單建立邏輯createorder()

//訂單建立結束後,刪除lockkey解鎖

lockservice.delfromlocklist(lockkey);

相應的lockservice實現如下:

@service

@slf4j

public

class

lockserviceimpl

implements

lockservice ", cachekey);

stringredistemplate.expire(cachekey, expiretime, timeunit.seconds);

}return !result;

}@override

//刪除key 解鎖

public

void

delfromlocklist(string cachekey)

}

建立了幾個String物件?

string str a 1個,在常量池中建立了乙個字串物件。string str new string a 2個,在常量池中建立了乙個字串物件 a 在堆中開闢了乙個空間又放了乙個 a string str a b 1個,在編譯期,jvm將 a b 自動識別成 ab 因此只建立了乙個物件,放在常量池...

因併發而生,因雲計算而熱

2008年11月17日,51cto聯合人民郵電出版社圖靈公司邀請了 erlang程式設計 一書的譯者趙東煒老師和在erlang開發方面有著豐富經驗的成立濤老師作客51cto聊天室,就erlang程式語言和雲計算方面的話題與進行了深入交流。本次聊天活動一共分為5個環節,聊天記錄在這裡,建議所有熱愛co...

mysql建立了索引但是leftjoin索引失效

select a.concat ws parent.name,b.name cityname,concat ws att.attachment name,attachment url attachment,c.name companyname,d.name typename,e.name stage...