2016-10-03 30 views
0

我們試圖創建一個算法/啓發式來安排某個時間段的交付,但這裏肯定存在競爭條件,因此兩個衝突的計劃項目可能會寫入數據庫,因爲寫入不是原子性的。避免在複雜條件下將模型插入數據庫的競態條件

真正阻止競態條件的唯一方法是創建一些原子插入操作TMK。

服務器收到一個請求,要求在某個時間段內調度某些內容,並且在將數據寫入數據庫之前,服務器必須檢查該時間段是否仍然可用。但在那個時候,服務器可能會得到類似的請求,並最終寫入衝突的數據。

如何規避此?有沒有辦法在數據庫本身創建一些腳本來掛鉤寫入操作以使整個事物變成原子?通過在該腳本上放置一個鎖定機制?是什麼讓整個事情變得非原子化是服務器和數據庫之間的讀取和連線時間。

+2

這聽起來像是你在編寫特定代碼時遇到問題。在這種情況下,如果您發佈[重現問題的最小代碼](http://stackoverflow.com/help/mcve),我們會更有幫助。 –

+1

這個問題可能屬於程序員.stackexchange? –

回答

2

每當我遇到競爭狀況,我想到一個即時解決方案QUEUE。

步驟1)您可以做的是不直接向數據庫添加數據,而是可以將其添加到隊列中而不檢查任何內容。

步驟2)單獨的閱讀器將從隊列檢查數據庫中讀取任何衝突並採取必要的措施。

這是解決此問題的方法之一如果您實施任何更好的解決方案,請分享它。

希望可以幫到

+0

感謝您的回答,我其實不知道這是如何解決問題的。 (1)同一隊列中的兩名工作人員可以在短時間內得到類似的請求,(2)兩名工作人員都可以從數據庫中讀取數據,並看到寫入沒有問題,(3)兩名工作人員都寫信給收集並有效地導致高級別數據衝突。 –

+0

避免上述情況的唯一方法是,如果寫入本身(3)是DB中的原子操作。問題是我們的DB中的寫入不是原子的,它取決於更多的條件,而不僅僅是數據庫中的單個字段,或者不是。 –

+0

你能更準確地描述隊列將如何解決問題嗎?謝謝! –