2011-04-06 34 views
0

我有一個允許用戶加入「團隊」的網站。該團隊在$maxPlayersPerTeam中定義了成員限制。來自不同用戶的同時點擊問題

當用戶點擊該鏈接加入一個團隊這段代碼被執行

//query to get players count 
if ($players < $maxPlayersPerTeam) { 
    // query to insert the player 
} 

但是,如果兩個用戶點擊的同時加入鏈接,都可以加入我們的團隊,即使$players等於$maxPlayersPerTeam

我該怎麼做才能避免這種情況?

+0

你應該提及你如何更新玩家人數;這是如何存儲的? – Jacob 2011-04-06 19:31:48

+0

是否在執行'if'語句之前檢索到'$ maxPlayersPerTeam'? – Kevin 2011-04-06 19:33:29

+0

你真的遇到過這個問題嗎? 2個用戶同時加入的情況幾乎是不可能的。 – Ali 2011-04-06 19:36:01

回答

1

您應該獲取數據集上的鎖(我希望您使用的是數據庫,對嗎?),執行檢查並最終更新數據集。所以如果兩個人真的同時執行代碼,其中一個必須等​​待另一個的鎖定。第二次獲取鎖定後,數據集已經更新,並且該人員也不能加入您的團隊。

0

假設您使用數據庫來存儲信息,您的數據庫系統應該有事務處理方法和管理方法,以處理同時發生的多個事務的事件(即使這是一個極其罕見的情況)。有關於此的維基文章(即使我很樂意鏈接到它)。 http://en.wikipedia.org/wiki/Transaction_processing

MySQL有這樣做的方法:http://dev.mysql.com/doc/refman/5.0/en/commit.html。和PostgreSQL一樣:http://www.postgresql.org/docs/8.3/static/tutorial-transactions.html