2011-12-09 9 views
0

사이트에 2 명의 사용자가있는 웹 사이트가 있습니다.그룹에 mysql을 삽입 하시겠습니까?

둘 다 mysql에 큰 행 1000 개를 삽입하는 PHP 페이지를로드하고 for 루프를 사용하여로드합니다.

는 지금, 인서트 예를 들어, 교차되어, 사용자 1에서 다음 5 사용자 2에서 다음 3 사용자 1, 15 인서트는 ...

어떻게 그것을 그렇다면 사용자 1로드를 만들 수 있습니다 PHP 2 파일을 먼저 작성한 다음 사용자 2가 시작할 수 있기 전에 사용자 1이 모든 행을 1000 개 삽입 할 때까지 대기해야합니다.

+0

테이블 잠금을 시도 했습니까? http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html - 실행 시간이 충분히 길다면 "user2"스크립트가 시간 초과 될 수 있습니다. 대기열을 벗어난 사용자가 시간이 초과된다는 사실은 거의 확실합니다. – CD001

+0

어떻게 행을 삽입하고 있습니까? 여러 값으로 하나의 INSERT 문을 작성하고 있습니까? 아니면 각 행을 따로 삽입 하시겠습니까? – liquorvicar

답변

0

는 문서입니다. 그러나 두 번째 쿼리를 보내기 전에 사용자의 모든 쿼리에 참여하려는 경우이 작업은 좀 더 복잡 할 수 있습니다. 메모리의 임시 테이블은 실제로 삽입하기 전에 사용자 세션 테이블을 유지하는 데 도움이 될 수 있습니다. 하지만 지연된 삽입이 문제를 해결할 것이라고 생각합니다.

+0

나는 이것을 조사 중이다. 감사! – David19801

0

PHP에는 세션간에 동기화를위한 기본 제공 메커니즘이 없습니다.

그러나 실제로 데이터베이스를 사용하는 사람의 정보가 들어있는 더미 파일이나 더미 테이블을 데이터베이스에 도입 할 수 있습니다. 사용자가 완료되면 데이터베이스를 다시 사용할 수 있음을 의미하는이 정보를 삭제해야합니다. 하나는 다른이 시작됩니다 완료가 바로 그 때, http://dev.mysql.com/doc/refman/5.5/en/insert-delayed.html

그것은 당신의 삽입 쿼리를 큐에 : 사용 MySQL은 삽입, 여기 지연

0

가짜 테이블을 사용하는 대신 memcache를 사용하고 사용자가 DB에 액세스하려고 할 때마다 그리고 액세스를 부여하기 전에 memcache가 확인 될 때마다 memcache에서 값을 설정할 수 있습니다. 프로세서를 잠 그려면 운영체제의 셈플 (semphores)과 동일한 개념으로 구현할 수 있습니다.

0

사용자가 저장하는 데이터의 종류와 사용자 2가 사용자가 삽입을 마칠 때까지 기다릴 필요가없는 이유를 알지 못합니다. 그러나 문제를 PHP 스크립트에서 DB로 옮깁니다.

삽입 된 데이터 immediatley에 액세스 할 필요가없는 경우이 방법을 사용합니다. 데이터의 고유성에 관계없이 사용자 1과 사용자 2의 모든 INSERT를 넣는 중간 테이블을 사용하는 것이 좋습니다. 그런 다음 MySQL에서이 중간 테이블의 모든 레코드를 가져 와서 오른쪽 테이블에 저장하여 중복을 제거하는 시간 초과 이벤트에서 주기적으로 호출되는 저장 프로 시저를 작성합니다. 그것은 당신의 디자인에 달려 있습니다. 그것은 SELECT DISTINCT 나 GROUP BY를 사용하는 것만으로 가능할 수 있습니다.

이 접근법은 동시성 문제를 PHP에서 데이터베이스로 전송합니다. PHP 스크립트를 매우 간단하고 확장 가능하게 유지할 수 있습니다. 복잡한 동시성 메커니즘을 추적 할 필요가 없으며 내일이라면 두 개가 아닌 세 개 이상의 동시 스크립트를 가질 수 있습니다. 사용자의 입장에서 보면 실행이 지연되지 않습니다.

유일한 단점은 INSERT 직후에 모든 데이터를 사용할 수 없다는 것입니다. DB 이벤트가 실행되기를 기다려야하기 때문입니다. 그러나 저장 프로 시저를주의해서 작성하면 10 분 또는 5 분마다 호출 할 수도 있습니다.

대신 삽입 된 데이터를 삽입하는 동안 거의 실시간으로 액세스해야하는 경우 시간 지정 이벤트 대신 트리거를 사용하여 부분적으로이 접근 방식을 수정할 수 있습니다. 중간 테이블을 쿠션으로 유지하면서 모든 데이터를 넣은 다음 트리거 (업데이트 후)를 사용하여 방금 삽입 한 레코드가 대상 테이블에 이미 있는지 확인하고없는 경우에만 넣습니다.

관련 문제