2012-03-11 5 views
0

'picks'라는 테이블이 있습니다. 사용자가 로그인하여 선택을 시작할 때 처음에는 해당 사용자의 "선택"테이블에 64 개의 행을 삽입합니다 (사용자 ID가 열로 있음) . 행은 php의 루프를 사용하여 삽입되므로 PDO 준비 문을 사용하여 64 개의 삽입이 있습니다. 이 작업은 사용자 당 한 번만 수행하면됩니다. 해당 사용자에 대해이 행이 연속적이어야합니다. 몇 명의 다른 사용자가 똑같은 일을 똑같이하고 있다면 어떻게 될까요? 행이 연속적으로 삽입되지 않을 가능성이 있습니까? 테이블 잠금 장치를 사용해야합니까? 나는 전에 그들을 사용한 적이 없다. MySql 버전 : 5.0.92-rs-log MyISAM 감사합니다.Mysql 사용자 당 연속 행 삽입

+0

궁금 해요 :이 같은

뭔가 (단지 이해할 수있는 코드를 만들기 위해 그것의의 PHP 함수에주의를 지불하지 않습니다)? –

+0

웬일인지 그들이 연속적 일 필요가있는 것처럼 보입니다. 내가이 앱을 썼을 때 나는 서둘러서 아마도 나쁜 코드를 썼다. 그 이유를 알아 내기 위해 나중에 케이트를 다시 써야 할 것입니다. – EricP

+0

SQL을 게시하여 해당 행을 검색하면 도움을 줄 수 있습니다. –

답변

0

실제로는 필요하지 않은 문제에 대해서는 테이블 잠금을 사용하지 않을 것입니다. 행이 연속적이어야합니다. 자동 증분 ID를 기반으로 주문 하시겠습니까? 그렇다면 연속적이지 않을 수도 있지만 순서대로 진행됩니다. 또한 해당 행에서 특정 주문이 필요한 경우 실제 주문을 설정하는 다른 열을 항상 추가 할 수 있습니다.

어쨌든 더 적절한 도움을 받으려면 질문을 확대하십시오.

0

우선, 단일 사용자가 연속적으로 ID를 사용하는 대신이 문제를 해결하는 더 좋은 방법이 있어야합니다.

실제로 동시성 문제가 발생할 가능성이 있습니다. 오라클과 같은 다른 DBMS에서는 auto_increment 대신 시퀀스를 사용하므로 이러한 유형의 항목에 더 적합합니다. 하나의 행만 가진 보조 테이블을 가지고이를 에뮬레이트 할 수 있습니다. 이 경우 귀하의 ID (또는 무엇이든) 필드는 auto_increment로 설정되지 않으며 마지막 ID를 저장할 곳은 sequence (예 :)입니다. 그런 다음 64 개의 새 레코드를 삽입하기 전에 해당 테이블을 쿼리하여 마지막 ID를 얻은 다음 업데이트합니다. 왜 기록은 연속 일 필요합니까 ...

// Get the last ID 
$last_id = query('SELECT last_id FROM sequence LIMIT 1'); 

// Store the last ID in your code and then update the new value 
$new_id = $last_id + 64; 
query('UPDATE sequence SET last_id = :new_id', array('new_id' => $new_id)); 

// Make sure your DB class is set on auto_commit or commit the transaction here 

// Insert your new records 
for ($i = ++$last_id; $i < $new_id; $i++) { 
    query('INSERT INTO picks (id, user_id) VALUES (:id, :user_id)', array('id' => $i, 'user_id' => $user_id)); 
}