为了账号安全,请及时绑定邮箱和手机立即绑定

PDO 一般错误:2014 无法执行查询,而其他未缓冲的查询在尝试锁定表时处于活动状态

PDO 一般错误:2014 无法执行查询,而其他未缓冲的查询在尝试锁定表时处于活动状态

PHP
Qyouu 2021-11-26 17:49:29
我正在将某人的旧代码从 using 更新mysql()为 using 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 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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

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


查看完整回答
反对 回复 2021-11-26
  • 1 回答
  • 0 关注
  • 124 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信