2013-01-15 35 views
0

在我的場景中,PLAYER每天可以執行2 ACTIONS(例如,每天可以攻擊2個其他玩家)。我實現了兩個持久化類:PlayerActionAction班級提到了PlayerDate這個動作(日期只包含日期部分,比如2013-01-15 00:00:00)。我想創建一個數據庫級約束條件,將具有特定日期的Action記錄數限制爲2.這將防止玩家每天執行超過2次的操作。該系統高度併發,應用程序級別檢查通常會失敗,允許玩家同時執行3-4次操作。正確限制SQL和休眠中特定記錄的數量

我目前的解決方案是實現第三個版本的實體PlayerDayActions與引用playerdateaction1action2。因此,我可以檢查action1 IS NULLaction2 IS NULL來計算玩家已經執行了多少動作,並且上的版本將不允許覆蓋同時修改的實例(如果有的話)。爲了擴展,我可以將action1和action2更改爲列表並檢查這樣的列表。

問題是否存在更乾淨和可擴展的解決方案?在Hibernate中的普通SQL?謝謝。

回答

0

如果您創建了第三個表PlayerDayAction,請獲取列Player,date,action列。每個動作添加一條記錄,如果(播放機等於2行動今天)不允許採取行動。除非您需要歷史數據,否則您甚至可以每晚或每週刪除數據,因此表格不會太大。

這就是我該怎麼做:)。

+0

此解決方案的問題是系統高度併發,用戶可以發送請求以同時執行多個操作(例如,通過腳本),我的系統將在並行線程中處理這些請求。因此,如果玩家已經執行了單個動作,並且請求執行另一個動作(並行請求),則兩個處理線程都將看到今天該用戶只有一個動作,並允許他執行另一個動作(取而代之的一個)。所以,這將以3個PlayerDayAction記錄而不是兩個結束。這就是爲什麼我需要數據庫級別的檢查 – jatvarthur