我的背景是作爲一個PHP開發人員,所以我不太清楚如何處理這種競爭條件,我一直在使用Java servlet和hibernate框架遇到問題。使用Java防止競爭條件
基本上,我試圖防止在後端雙重提交付款請求。當付款請求到達時,我會檢查客戶當前付款狀態的數據庫。如果它是「UNPAID」,我將DB更新爲「PROCESSING」,並在所有事情完成時繼續處理付款,最後將其設置爲「付費」。
但是,我相信hibernate沒有運行我的數據庫更新,直到會話關閉。這意味着如果在我的第一個付款請求完成處理之前發出第二個請求,它將再次處理付款請求。
在PHP中,我只是在付款頁面被點擊時檢查並更新付款狀態,我從來沒有遇到任何與競爭條件有關的問題。但是,我以前使用的這種模式在我正在開發的Java環境中不起作用。
有沒有人有過這樣做的正確方法?
對此的答案將是複雜和廣泛的計算器。如果你想防止數據庫在髒的狀態下讀取數據,你應該使用數據庫鎖定系統。 –
你能不能提供一點信息?我對Java的經驗非常有限,而且「數據庫鎖定系統」不是我之前遇到過的。 – user7862512
Servlets應該像每個請求都是單線程一樣編寫。使您的數據庫以適當的隔離級別寫入事務。它會工作。從JDBC教程開始:https://docs.oracle.com/javase/tutorial/jdbc/ – duffymo