2011-10-17 33 views
5

我正在在線muiltiplayer棋盤遊戲&有一個SQL服務器的問題。如何執行一個1到n的關係

讓我們假設遊戲允許兩個玩家。創建遊戲時,創建者將作爲第一個用戶添加。

此時,兩個用戶可以嘗試同時加入遊戲。其中一個用戶應該被阻止。

我的數據庫架構如下:

tbGame - contains a list of all games. PrimaryKey is GameId 
tbPlayers - contains a list of all registered users. PrimaryKey is PlayerId 
tbPlayersInGame - contains a list of all players in each game. Foreign key 
        relations to tbGame and tbPlayers. 

我覺得我需要兩樣東西:

  1. 的一種方式基礎上,遊戲ID鎖定tbPlayersInGame。這會在添加玩家到遊戲時使用。從我讀過的內容來看,它聽起來像是一個關鍵範圍的鎖(在GameId上)會是合適的。
  2. 一種強制執行1對2關係的方法,以便嘗試添加第3個玩家將失敗。

回答

1

一對夫婦建議:

1)當您嘗試寫入tbPlayersInGame表首先做一個SELECT,以確保遊戲不充分,然後再插入到表中。將此SELECT和INSERT INTO包裝在事務隔離級別設置爲可序列化的事務中。

2)不要有一個單獨的tbPlayersInGame表,而不是在tbGame 2場:Player1Id,Player2Id

+0

我最終採取了這種方法。查詢是這樣的: 「事務隔離級別設置SERIALIZABLE BEGIN TRANSACTION IF(SELECT COUNT(*)FROM PlayersInGame WHERE遊戲ID = @GameId