1

我正在将某人的旧代码从 using 更新mysql()为 using PDO。在一个地方,他们有一些LOCK TABLES命令来防止两个用户同时访问相同的数据。运行时LOCK TABLESPDO抛出“一般错误: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,但我仍然得到同样的错误。

我尝试了 and 的各种组合ATTR_EMULATE_PREPARESMYSQL_ATTR_USE_BUFFERED_QUERY但似乎没有任何区别。

4

1 回答 1

1

你应该exec()改用query(). exec()不期望任何返回值,这正是LOCK TABLES需要的。

$pdo->exec("LOCK TABLES Inspections WRITE");
于 2019-08-17T17:05:52.943 回答