2016-08-29 97 views
0

使用CakePhp作爲中間API,可以在不同市場同步庫存並保存訂單歷史記錄。當在一個市場上進行訂單時,它會更新其他市場上的庫存,反之亦然。現在,我有一個來自市場的通知,告訴我的API剛剛進入訂單。問題是,此通知是在兩次分開的時間,同時發送完全相同的信息。我的API同時運行這兩個單獨的calles並生成兩個插入。我確實有一個代碼,用於檢查傳入訂單中的Order_ID是否在保存其插入的訂單歷史記錄的表上重複。但由於調用完全是在同一時間完成的,因此代碼檢查Order_ID是否存在時,它不會創建兩個不同的插入,並重復訂單。CakePhp:防止同時插入相同信息的重複呼叫

通知幾乎是相同的,我收到此:

{ 
    "resource":"\/orders\/order_id", 
    "user_id":"user_id", 
    "topic‌​":"orders", 
    "applicat‌​ion_id":idhere, 
    "atte‌​mpts":1, 
    "sent":"2016‌​-07-26T14:34:00.342Z‌​", 
    "received":"2016-0‌​7-26T14:34:00.338Z" 
}‌ 

在一個通知,而另一個具有相同的信息,但與差的小於1每秒發送和從所述第一通知接收之間。與此同時,我使用order_id來調用訂單中的信息並將其保存到歷史記錄表中。

我需要的是延遲發生的一種方式,所以檢查我工作正常或另一種方式來檢查重複的order_id。值得注意的是,它不是兩個插入一個電話。有兩個分離的通知調用,這使得我的代碼在重複時很難真正得到。任何想法我可以嘗試嗎?

+0

顯示請求,最好使用Charles Proxy等工具完成請求轉儲。他們肯定是一樣的嗎?我很確定有可能找出哪個請求首先進入,並將它們與之前的請求進行比較。另一種解決方案可能是將請求堆疊起來並逐個處理它們。 – burzum

+0

通知幾乎完全相同,我重新提到:'{「resource」:「\/orders \/order_id」,「user_id」:「user_id」,「topic」:「orders」,「application_id」:idhere,「企圖「:1,」發送「:」2016-07-26T14:34:00.342Z「,」已收到「:」2016-07-26T14:34:00.338Z「}」在一個通知中,而另一個具有相同的信息但從第一次通知發送和接收之間的差異小於1秒。與此同時,我使用order_id來調用訂單中的信息並將其保存到歷史記錄表中。 –

+1

在您的模型中使用isUnique()規則,並在其上爲數據庫本身添加一個唯一索引。這不是已經解決了這個問題嗎?如果不是,爲什麼?然後會發生什麼?如果您使用事務,則在每次保存後嘗試提交,以免在一次事務中嘗試保存多個可能的重複行。 – burzum

回答

1

這很難看,但是您可以在歷史記錄表的Order_ID列上創建唯一索引。

這樣,具有相同Order_ID的插入將不會成功。

+0

我想到了那個哈哈哈,但是不太確定它是否會奏效:P我給它一個鏡頭。 –