2016-11-17 98 views
0

我正在使用hibernate在Soap WebServices應用程序上工作。在這我爲每個訂單生成orderNumbers。要做到這一點我有如下表兩個字段java中的線程同步問題

ORDER_SERIES LAST_ORDER_COUNT


ORD 250

要生成ORDER_NO首先我通過1得到上面的表格和increament LAST_ORDER_COUNT記錄,並與ORDER_SERIES

追加

so so ORDER_NO would ORD251

之後,我正在更新上面的表與新的不勒斯nted LAST_ORDER_COUNT

ORDER_SERIES LAST_ORDER_COUNT


ORD 251

我寫了一個方法來完成這個操作意味着得到表記錄,increament LAST_ORDER_COUNT追加既沒有返回訂單並更新LAST_ORDER_COUNT。我使這個方法同步。

但在生產環境中我得到複製ORDER_NOs

我的肥皂web服務越來越爲Android APK調用。

爲什麼ORDER_NO越來越重複

+0

這是因爲你的操作不是原子的。你使用什麼DBMS。其中大多數都是內置的方法來自動創建唯一的ID。 – Fildor

+0

我正在使用postgres數據庫 – user3787163

+0

我找到了解決上述問題的方法。選擇記錄時,我們可以使用「選擇更新」查詢。當我們使用「select for update」選擇任何記錄時,那條記錄將被鎖定,直到我們更新它。意味着沒有兩個線程可以從特定記錄中獲得相同的值 – user3787163

回答

0

ID必須在數據庫中自動遞增,它應該是一個主/唯一鍵以及任何想法。如果你將來不會這樣做,那麼當你同時有更多的請求時,你會遇到這種類型的問題。