>데이터 베이스 >MySQL 튜토리얼 >MySQL 오류 '버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안 쿼리를 실행할 수 없습니다'를 해결하는 방법은 무엇입니까?

MySQL 오류 '버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안 쿼리를 실행할 수 없습니다'를 해결하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-07 17:03:12977검색

How to Solve the MySQL Error

MySQL의 "버퍼링되지 않은 다른 쿼리가 활성 상태인 동안 쿼리를 실행할 수 없습니다" 오류 해결

소개:

MySQL의 클라이언트 프로토콜은 하나의 쿼리만 실행할 수 있다는 제한을 둡니다. 동시에. 이전 쿼리의 결과를 가져오지 않은 상태에서 추가 쿼리를 실행하려고 하면 "버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안에는 쿼리를 실행할 수 없습니다."라는 오류가 발생할 수 있습니다. 이 문제는 특정 시나리오, 특히 PDO::ATTR_EMULATE_PREPARES 속성이 false로 설정된 상태에서 PHP 데이터 개체(PDO)를 사용할 때 발생할 수 있습니다.

원인:

근본 원인은 MySQL 클라이언트 프로토콜이 동시에 여러 쿼리를 진행할 수 없다는 데 있습니다. 쿼리가 실행되면 클라이언트 라이브러리는 자동으로 모든 결과를 가져와서 캐시하므로 MySQL과 통신하지 않고도 저장된 결과에 대해 후속 가져오기를 반복할 수 있습니다. "버퍼 쿼리"라고 알려진 이 접근 방식을 사용하면 초기 결과가 검색된 후 MySQL 서버가 추가 처리를 하지 않아도 됩니다.

반대로, 버퍼되지 않은 쿼리는 결과를 캐시하지 않으므로 클라이언트가 한 번에 하나씩 가져와야 합니다. 이 제약 조건은 첫 번째 쿼리 결과를 완전히 가져오기 전에 두 번째 쿼리가 실행될 때 발생합니다. MySQL 서버는 이를 활성 쿼리 간의 충돌로 해석하고 오류 메시지를 트리거합니다.

해결 방법:

이 문제를 해결하려면 다음 전략을 사용할 수 있습니다.

  • fetchAll() 사용: fetchAll() 호출 메서드를 사용하면 쿼리의 모든 결과가 PHP에서 검색되고 캐시됩니다. 이 접근 방식은 버퍼링된 쿼리를 효과적으로 시뮬레이션하여 오류가 발생하지 않고 후속 쿼리를 실행할 수 있도록 합니다.
  • Enable PDO::MYSQL_ATTR_USE_BUFFERED_QUERY: 이 PDO 속성을 true로 설정하면 버퍼링된 쿼리가 강제로 사용됩니다. PDO::ATTR_EMULATE_PREPARES 설정과 관계없이. 이 방법을 사용하면 첫 번째 가져오기 시 모든 결과를 암시적으로 가져오므로 후속 쿼리와의 충돌이 방지됩니다.
  • 커서 닫기: 쿼리에서 closeCursor()를 호출하면 MySQL 서버에 결과가 명시적으로 알립니다. 결과는 폐기될 수 있습니다. 이렇게 하면 오류가 발생하지 않고 새 쿼리를 실행할 수 있습니다. closeCursor()는 의도한 모든 결과를 가져온 후에만 사용해야 한다는 점에 유의해야 합니다.

추가 고려 사항:

  • MySQL 클라이언트 라이브러리와의 호환성이 다양할 수 있으므로 PHP 버전 변경으로 인해 문제가 간헐적으로 발생할 수 있습니다.
  • 이 오류는 각 쿼리에 결과 집합이 포함된 여러 활성 쿼리가 있을 때 가장 일반적으로 나타납니다.
  • 더 많은 기능과 메모리를 제공하는 MySQL 네이티브 드라이버(mysqlnd)로 전환하는 것이 좋습니다. 효율성.

코드 예:

제공된 코드는 fetchAll()을 활용하거나 명시적으로 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY를 true로 설정하여 오류를 방지하도록 수정할 수 있습니다. .

$sql ='SELECT temp_id FROM temp1';
$stmt2 = db::db()->prepare($sql);
$stmt2->execute();
$rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC);
$stmt2->closeCursor();

$sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes 
      WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id';
$stmt1 = db::db()->prepare($sql);

foreach($data AS $row)
{
    try
    {
        $stmt1->execute($row);
        $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC);
        $stmt1->closeCursor();
        syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand());
        syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand());
    }
    catch(PDOException $e){echo(sql_error($e));}            
}

위 내용은 MySQL 오류 '버퍼링되지 않은 다른 쿼리가 활성화되어 있는 동안 쿼리를 실행할 수 없습니다'를 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.