【问题标题】:PDO General error: 2014 Cannot execute queries while other unbuffered queries are active when trying to LOCK TABLESPDO 一般错误:2014 无法执行查询,而其他无缓冲查询在尝试锁定表时处于活动状态
【发布时间】:2019-12-23 13:41:18
【问题描述】:

我正在将某人的旧代码从使用 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$_DB->commitUNLOCK TABLES 之后,但我仍然得到同样的错误。

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

【问题讨论】:

  • 请不要为了打印错误信息而捕获异常。如果需要,请不要理会异常或重新抛出它。
  • 感谢@Dharman - 很高兴知道。
  • 很高兴知道为什么您的代码需要锁?可能有一种方法可以在没有锁的情况下做同样的事情。
  • 我认为它用于确保如果两个人尝试同时编辑检查,则在检查是否有人正在编辑它和更新到之间不会存在竞争条件说我正在编辑它。

标签: php mysql pdo table-locking unbuffered-queries


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 2015-12-24
    • 1970-01-01
    相关资源
    最近更新 更多