2017-06-29 72 views
-2

我的背景是作爲一個PHP開發人員,所以我不太清楚如何處理這種競爭條件,我一直在使用Java servlet和hibernate框架遇到問題。使用Java防止競爭條件

基本上,我試圖防止在後端雙重提交付款請求。當付款請求到達時,我會檢查客戶當前付款狀態的數據庫。如果它是「UNPAID」,我將DB更新爲「PROCESSING」,並在所有事情完成時繼續處理付款,最後將其設置爲「付費」。

但是,我相信hibernate沒有運行我的數據庫更新,直到會話關閉。這意味着如果在我的第一個付款請求完成處理之前發出第二個請求,它將再次處理付款請求。

在PHP中,我只是在付款頁面被點擊時檢查並更新付款狀態,我從來沒有遇到任何與競爭條件有關的問題。但是,我以前使用的這種模式在我正在開發的Java環境中不起作用。

有沒有人有過這樣做的正確方法?

+0

對此的答案將是複雜和廣泛的計算器。如果你想防止數據庫在髒的狀態下讀取數據,你應該使用數據庫鎖定系統。 –

+0

你能不能提供一點信息?我對Java的經驗非常有限,而且「數據庫鎖定系統」不是我之前遇到過的。 – user7862512

+0

Servlets應該像每個請求都是單線程一樣編寫。使您的數據庫以適當的隔離級別寫入事務。它會工作。從JDBC教程開始:https://docs.oracle.com/javase/tutorial/jdbc/ – duffymo

回答

1

根據你的描述,我會說你的PHP代碼有隱藏的競爭條件,你只是沒有意識到它。你需要從另一個角度解決這個問題。放棄假設,你可以防止雙重提交,而不是假設他們不可避免的。一旦你意識到這是真的,你可以建立一個合適的設計(這可能會比你目前有很多不同)。如果您可以發佈您的架構和一些示例代碼,我可能會提供一些建議。