2013-01-02 6 views
3

PDO를 사용하여 DROP TABLE IF EXISTS로 시작하는 저장 프로 시저를 호출하고 있습니다. 난 무작위로 PDOException 'SQLSTATE [42S02] 받고 있어요 : 기본 테이블 또는 뷰를 찾을 수 없습니다 : 1146 테이블'historygr.reached '존재하지 않는'및 심지어 더 이상 성가신 그것을 말할 예외가 throwing 말할 것이다 테이블은 이미 동일한 연결에서 겉으로보기에는 몇 초 안에 존재합니다.DROP TABLE IF가있는 PDOException

오류를 직접 트리거 할 수는 없지만 오류 알림이 표시됩니다.

다음은 오류에 기인는 PHP의 :

$dbh = PDODB::getInstance(); 
$stmt = $dbh->query("CALL ListReached(".$this->item_id.")"); // <-- ERROR 
$items = $stmt->fetchAll(); 

그리고 여기 MySQL의 절차 정의입니다 :

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `ListReached`(IN root INT) 
BEGIN 
    DECLARE rows SMALLINT DEFAULT 0; 

    DROP TABLE IF EXISTS reached; 
    CREATE TABLE reached(
    node_id INT PRIMARY KEY 
    ) ENGINE=HEAP; 

    INSERT INTO reached VALUES (root); 
    SET rows = ROW_COUNT(); 

    WHILE rows > 0 DO 
    INSERT IGNORE INTO reached 
     SELECT DISTINCT child_id 
     FROM related_item AS r 
     INNER JOIN reached AS p ON r.parent_id = p.node_id; 
    SET rows = ROW_COUNT(); 

    INSERT IGNORE INTO reached 
     SELECT DISTINCT parent_id 
     FROM related_item AS r 
     INNER JOIN reached AS p ON r.child_id = p.node_id; 
    SET rows = rows + ROW_COUNT(); 
    END WHILE; 

    DELETE FROM reached WHERE node_id = root; 

    SELECT * FROM reached; 
    DROP TABLE reached; 

END 

답변

1

당신은 경쟁 조건을 타격한다.

두 연결이 모두 동일한 스크립트를 실행하는 경우 충돌을 일으키는 동일한 테이블을 만들고 삭제합니다.

트랜잭션 내에서 실제 테이블을 생성하고 삭제하는 대신 임시 테이블을 사용하는 것을 고려하십시오. 테이블을 만들 때

http://dev.mysql.com/doc/refman/5.1/en/create-table.html

당신은 임시 키워드를 사용할 수 있습니다. TEMPORARY 테이블은 현재 연결에만 표시되며 연결이 닫히면 자동으로 삭제됩니다. 즉, 두 개의 서로 다른 연결이 서로 충돌하지 않고 동일한 임시 테이블 이름을 사용하거나 동일한 이름의 기존 비 임시 테이블과 사용할 수 있습니다. (기존 테이블은 임시 테이블이 제거 될 때까지 숨겨집니다.) 임시 테이블을 생성하려면 CREATE TEMPORARY TABLES 권한이 있어야합니다.

편집 의견 했나요으로

, 쿼리는 테이블 몇 시간을 참조한다.

또 다른 방법은 절차 내에서 잠금을 사용하는 것입니다 http://dev.mysql.com/doc/refman/5.5/en/miscellaneous-functions.html#function_get-lock 불행하게도

+0

어떻게 프로 시저 기능을 –

+0

그래, 당신은 것입니다 쿼리에 두 번 이상 그들을 더를 참조 할 수 있기 때문에 임시 테이블을 사용할 수 없습니다 임시 테이블 복사본을 여러 번 참조 (n-1 copy per reference)하거나 임시 테이블을 두 번 이상 참조하지 않는 쿼리를 변경해야합니다. –

관련 문제