Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Menyelesaikan Ralat MySQL 'Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak dibuffer lain aktif'?
Mengatasi "Tidak boleh melaksanakan pertanyaan semasa pertanyaan lain yang tidak ditimbal aktif" Ralat dengan MySQL
Pengenalan:
Protokol klien MySQL mengenakan had di mana hanya satu pertanyaan boleh masuk pelaksanaan secara serentak. Apabila cuba melaksanakan pertanyaan tambahan sementara hasil daripada pertanyaan sebelumnya kekal tidak diambil, pengguna mungkin menghadapi ralat "Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak penimbal lain aktif." Isu ini boleh timbul dalam senario tertentu, terutamanya apabila PHP Data Objects (PDO) digunakan dengan atribut PDO::ATTR_EMULATE_PREPARES ditetapkan kepada false.
Punca:
The punca utama terletak pada ketidakupayaan protokol klien MySQL untuk mempunyai berbilang pertanyaan yang sedang dijalankan secara serentak. Sebaik sahaja pertanyaan dilaksanakan, pustaka klien secara automatik mengambil semua keputusannya dan menyimpannya dalam cache, membolehkan pengambilan berikutnya untuk melelakan hasil yang disimpan tanpa berkomunikasi dengan MySQL. Pendekatan ini, yang dikenali sebagai "pertanyaan buffered," membebaskan pelayan MySQL daripada pemprosesan selanjutnya sebaik sahaja keputusan awal diperolehi.
Sebaliknya, pertanyaan yang tidak ditimbal tidak menyimpan hasil cache, yang memerlukan klien mengambilnya satu demi satu. Kekangan ini timbul apabila pertanyaan kedua dilaksanakan sebelum keputusan pertanyaan pertama telah diambil sepenuhnya. Pelayan MySQL mentafsir ini sebagai konflik antara pertanyaan aktif dan mencetuskan mesej ralat.
Penyelesaian:
Untuk menyelesaikan isu ini, strategi berikut boleh digunakan:
Pertimbangan Tambahan:
Contoh Kod:
Kod yang disediakan boleh diubah suai untuk mengelakkan ralat dengan menggunakan fetchAll() atau tetapan PDO:: MYSQL_ATTR_USE_BUFFERED_QUERY kepada benar.
$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));} }
Atas ialah kandungan terperinci Bagaimana untuk Menyelesaikan Ralat MySQL 'Tidak dapat melaksanakan pertanyaan semasa pertanyaan tidak dibuffer lain aktif'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!