1

我有一個Games用戶可以加入的列表。要選擇game,他們必須在該遊戲中選擇position(即角色)。MVC3/EF4中的併發請求處理

模型

[Game] 1 <-> * [PlayerGame] * <-> 0..1 [Player] 

的PlayerGame實體定義由玩家所拾取位置。

其他細節

  • 所有的遊戲都是一個MVC 3視圖中列出。
  • 數據保存在SQL Server 2008實例中,並通過EF4(CodeFirst)訪問。
  • 該視圖通過一些jQuery Get()調用來更新自己,這些調用可以獲取最新的數據,每個數據爲N毫秒。
  • 延遲越高(),競賽條件的機會越大,其中2名用戶將嘗試選擇相同的位置。
  • 我顯然需要做一些服務器端驗證,以便只有兩個用戶中的一個能夠獲得選定的位置,如果他們都在同一時間選擇相同的位置。

什麼會是驢最好的辦法只有1人得到所選擇的位置,而另一個得到一個錯誤的信息?

我目前正在考慮使用TimeStamps來確保只有的2次調用才能成功更新PlayerGame行。這是一個好主意嗎?

回答

1

是使用時間戳。這是通常使用的方式,SQL Server(任何數據庫服務器)和EF都支持它們。您必須將時間戳記傳遞給客戶端,並在構建要更新的實體時使用它(在分離的場景中)。

+0

的主要問題我與時間戳是看你可能得到我必須在創建遊戲的同時創建每個PlayerGame實體。因此PlayerGame.PlayerId必須是可空的。儘管如此,這並不是什麼大不了的事情! – 2011-12-13 20:32:16

1

從你的問題我可以假設你也有一個[Positions]表?如果不是,那些來自哪裏?

所以你真的不需要有時間戳嗎?在您堅持實體之前,請執行以下操作:entity.List().Where(x => x.GameId == requestedGameId && x.PositionId == requestedPositionId)

然後,如果您收到空值,但它尚未存在,則可以提交它的安全性,如果您確實收到實體,則該位置已被採納。

注:我不是那熟悉的實體框架語法,只是猜測這將會是個什麼樣子,但是當我的意思是我的僞代碼

+0

是的,有一個Position值,它是PlayerGame的一個屬性。你的解決方案的問題在於檢查玩家A是否已經獲得了位置的檢查可以在玩家B嘗試更新該行(或者,比如1ms之後)的同時完成。那些比賽條件意味着玩家A不會得到錯誤信息,但是他的位置會被玩家B偷走,而我顯然不希望這樣。 – 2011-12-13 20:14:01