2011-04-06 4 views
0

사용자가 "팀"에 가입 할 수있는 웹 사이트가 있습니다. 팀의 구성원 제한은 $maxPlayersPerTeam입니다. 사용자가 두 명의 사용자가 동시에 가입 링크를 클릭하면,이 코드는 그러나 다른 사용자가 동시에 클릭 할 때의 문제

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

실행됩니다 팀에 가입 링크를 클릭

, 모두 $players가 동일한 경우에도 팀에 합류 할 수 $maxPlayersPerTeam.

이 문제를 방지하려면 어떻게해야합니까?

+0

플레이어 수를 어떻게 업데이트하는지 언급해야합니다. 어떻게 저장 되나요? – Jacob

+0

'if' 문을 실행하기 직전에'$ maxPlayersPerTeam'이 검색 되었습니까? – Kevin

+0

실제로이 문제가 발생 했습니까? 동시에 참여하는 2 명의 사용자 시나리오는 거의 불가능합니다. – Ali

답변

0

어떤 사람들은 이미 이런 종류의 문제에 대해 노력해 왔으며 가능한 해결책을 제시했습니다 : database transactions. 이들을 처리하는 가장 좋은 방법은 PDO 및 그 beginTransaction, commitrollBack 방법을 사용하는 것입니다.

테이블은 트랜잭션을 허용하는 데이터베이스 엔진을 사용해야합니다 (MyISAM 대신 innoDb).

1

데이터 집합에 잠금 장치를 가져야합니다 (데이터베이스를 사용하고 싶습니다.), 확인을 실행하고 결국 데이터 집합을 업데이트하십시오. 따라서 두 사람이 실제로 코드를 동시에 실행하면 두 코드 중 하나가 다른 코드를 잠글 때까지 기다려야합니다. 두 번째로 잠금을 획득 한 후 데이터 세트가 이미 업데이트되었으며 해당 팀원도 팀에 가입 할 수 없습니다.

0

데이터베이스를 사용하여 정보를 저장한다고 가정하면 데이터베이스 시스템에는 트랜잭션 처리 및 관리 방법이 있어야합니다. 이는 동시에 발생하는 여러 트랜잭션의 이벤트를 처리합니다. (매우 드물 긴하지만). 이것에 wiki 기사가있다 (비록 내가 그것에 링크하기 위해 hestitate하더라도). 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.

관련 문제