在我的場景中,PLAYER
每天可以執行2 ACTIONS
(例如,每天可以攻擊2個其他玩家)。我實現了兩個持久化類:Player
和Action
。 Action
班級提到了Player
和Date
這個動作(日期只包含日期部分,比如2013-01-15 00:00:00)。我想創建一個數據庫級約束條件,將具有特定日期的Action
記錄數限制爲2.這將防止玩家每天執行超過2次的操作。該系統高度併發,應用程序級別檢查通常會失敗,允許玩家同時執行3-4次操作。正確限制SQL和休眠中特定記錄的數量
我目前的解決方案是實現第三個版本的實體PlayerDayActions
與引用player
,date
,action1
和action2
。因此,我可以檢查action1 IS NULL
或action2 IS NULL
來計算玩家已經執行了多少動作,並且上的版本將不允許覆蓋同時修改的實例(如果有的話)。爲了擴展,我可以將action1和action2更改爲列表並檢查這樣的列表。
問題是否存在更乾淨和可擴展的解決方案?在Hibernate中的普通SQL?謝謝。
此解決方案的問題是系統高度併發,用戶可以發送請求以同時執行多個操作(例如,通過腳本),我的系統將在並行線程中處理這些請求。因此,如果玩家已經執行了單個動作,並且請求執行另一個動作(並行請求),則兩個處理線程都將看到今天該用戶只有一個動作,並允許他執行另一個動作(取而代之的一個)。所以,這將以3個PlayerDayAction記錄而不是兩個結束。這就是爲什麼我需要數據庫級別的檢查 – jatvarthur