php - PDO 一般错误 : 2014 Cannot execute queries while other unbuffered queries are active when trying to LOCK TABLES

标签 php mysql pdo table-locking unbuffered-queries

我正在将某人的旧代码从使用 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);
}

我还尝试在 LOCK TABLES 之前添加一个 $_DB->beginTransaction 并在 UNLOCK 之后添加一个 $_DB->commit TABLES,但我仍然遇到同样的错误。

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

最佳答案

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

$pdo->exec("LOCK TABLES Inspections WRITE");

关于php - PDO 一般错误 : 2014 Cannot execute queries while other unbuffered queries are active when trying to LOCK TABLES,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57538053/

相关文章:

PHP + MySQL 事务示例

php - 网站左侧有一个 "1"。我不知道它从哪里来

php - 如何在Codeigneitor中同时向数据库插入多条记录

php - 忽略 MySQL JOIN 查询中的空结果

java - 无法在带有 MySql 的 JPA 实体中使用 java.time.LocalDate

php - 使用 jQuery-AJAX 向 PHP 提交表单并在 div 中显示新内容而不刷新的问题

php - 如何在php中显示mysql数据库的最高值

mysql - 重新安装了 XAMPP,现在无法登录 phpMyAdmin/XAMPP 不起作用

javascript - 如果记录已经存在或者如果它在 PDO MySQL 插入查询中不存在,我如何生成 javascript 警报?

php - 如何判断 PDO 模块是否已安装/禁用?