2017-05-04 80 views
0

我的應用程序接收來自外部源的多個請求(來自銷售點單位的發票)。它每秒獲得幾十個請求,其中一些請求是相同的(具有相同的請求主體)。多個插入/更新的唯一密鑰例外

請求數據被轉換並保存到兩個關聯的表(外鍵)中。如果記錄已經存在(通過唯一組合鍵查詢),記錄被更新,否則記錄被添加。

的問題是,與同一個身體,有時如果兩個請求在同一時間的應用程序接收到的唯一的密鑰已經存在,不能將它插入拋出異常:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 

這也可能是某種種族條件在MySQL,但不能算出它

整個過程被包裹在Laravel交易。我嘗試設置不同的隔離級別。 SERIALIZABLE解決了這個問題,但後來我得到了很多死鎖異常,並且正如我所看到的,有時候記錄根本就沒有保存。

回答

0

這很簡單,發生在這裏,你有一些值聲明爲「UNIQUE」或「主鍵」或類似的東西,你試圖再次插入,一些關鍵限制它阻止插入,這應該是好的,你避免了數據庫中的重複條目,但是你需要做的是檢查數據中你想要插入的數據是否存在於數據庫中,而不是所有列,你應該詢問你的密鑰或組合鍵,我可以如果我不知道數據或表...

+0

除了這個部分以外的好答案「但你需要做的是檢查數據是你想要插入的數據之前是否存在於數據庫中,「這是錯誤的。正確的做法是讓數據庫處理它,然後捕獲拋出的異常。 – e4c5

+0

你是對的,如果它有很多的數據,這可能需要很多時間,回去,檢查只是和他可能只有幾次,當他有這個問題,一些簡單的解決方案可以是https:/ /laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete – aasanchez

+0

@aasanchez正如我在我的問題中寫的,如果記錄存在,它已更新,我已經檢查記錄是否存在。但是我認爲會出現某種競賽狀況,並且同一記錄試圖同時插入,檢查被忽略...... –

相關問題