我正在研究一個項目,並且遇到了某種「設計問題」。我有一個代表「競爭」的實體。用戶得到了投票,他們在競爭中投票。每場比賽有10個項目,每個比賽只能投10票。當用戶嘗試使用他們的投票時,我會快速搜索他們尚未投票的公開比賽。對JPA中高併發實體和競爭條件的思考...交易?
問題出現在我想到多個用戶都參加同一競爭時。我不在乎兩個用戶是否同時投票,但是我想在最近關閉比賽的時候防止錯誤,但仍然有用戶投票,因爲他們在結束之前選擇了......我認爲投票即將結束時的「競賽條件」。
我看到它的方式,只有幾個選擇:
選項1:打開READ_COMMITTED交易,但我的理解是,這鎖定在讀取行,所以沒有其他的查詢將完成,直到鎖定返回。由於這是一個JSP應用程序,因此當JSP完成呈現時,讀取鎖定是否結束?似乎我仍然可能有同樣的問題。
選項2:寫出有多少用戶已經簽出了比賽。這似乎遵循了Database-as-IPC的反模式,而且我可以看到監視和維護計數的位置在最好的情況下會非常棘手。選項3:不要擔心。如果用戶的投票時間過長,那麼只需輸入一個錯誤,並讓他們移動到下一個。
選項4:嚴重依賴AJAX,可能使用Atmosphere進行消息傳遞,以在比賽頁面上保留實時投票計數。不知道你是如何處理瀏覽器超時的,或者當用戶只是在中間離開的時候...或許某種清理計時器?
現在我傾向於選項4,因爲它似乎在易用性和易用性之間取得了很好的平衡,但我想確保我不會錯過任何角度這裏。
其他人如何處理類似的情況?