Общая ошибка PDO: 2014. Невозможно выполнить запросы, когда другие небуферизованные запросы активны при попытке заблокировать таблицы

Я обновляю чей-то старый старый код с помощью mysql() использовать PDO, В одном месте у них есть некоторые LOCK TABLES команды, чтобы запретить двум пользователям доступ к одним и тем же данным одновременно. При беге LOCK TABLES, PDO Выдает "Общая ошибка: 2014: невозможно выполнить запросы, пока активны другие небуферизованные запросы".

Я сделал некоторый тестовый код для устранения других переменных. Система работает на Ubuntu 18 / PHP 7.2 / MySQL 5.7.27:

try {
    $_DB=new PDO("mysql:host=".DBHOST.";dbname=".DBNAME.";charset=utf8", DBUSER, DBPASS,array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8", PDO::ATTR_TIMEOUT => "5",  PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::MYSQL_ATTR_DIRECT_QUERY=>false,PDO::MYSQL_ATTR_USE_BUFFERED_QUERY=>true ));      

    // This gives the 2014 error. Any queries following this get the 2014 error.
    // Any queries before this work fine.
    $_DB->query("LOCK TABLES Inspections WRITE");

    $_DB->query("UNLOCK TABLES");
}
catch (Exception $e) {
    logError("Error : ".$e->getMessage());           
    // per @dharman's comment 
    //exit();
    throw($e);
}

Я также попытался добавить $_DB->beginTransaction перед LOCK TABLES а также $_DB->commit после UNLOCK TABLES, но все же я получаю ту же ошибку.

Я пробовал различные комбинации ATTR_EMULATE_PREPARES а также MYSQL_ATTR_USE_BUFFERED_QUERYНо, кажется, ничто не имеет значения.

1 ответ

Решение

Вы должны использовать exec() вместо query(), exec() не ожидает каких-либо возвращаемых значений, что именно LOCK TABLES необходимо.

$pdo->exec("LOCK TABLES Inspections WRITE");
Другие вопросы по тегам