Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO常规错误:2014无法执行查询,而其他未缓冲查询在尝试锁定表时处于活动状态_Php_Mysql_Pdo_Table Locking_Unbuffered Queries - Fatal编程技术网

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

Php PDO常规错误:2014无法执行查询,而其他未缓冲查询在尝试锁定表时处于活动状态,php,mysql,pdo,table-locking,unbuffered-queries,Php,Mysql,Pdo,Table Locking,Unbuffered Queries,我正在将某人的旧代码从使用mysql()更新为使用PDO。在一个地方,他们有一些锁表命令来防止两个用户同时访问相同的数据。运行LOCK TABLES时,PDO抛出“一般错误:2014无法执行查询,而其他未缓冲查询处于活动状态” 我编写了一些测试代码来消除其他变量。系统运行在Ubuntu 18/PHP 7.2/MySQL 5.7.27上: try { $_DB=new PDO("mysql:host=".DBHOST.";dbname=".DBNAME.";charset=utf8", D

我正在将某人的旧代码从使用
mysql()
更新为使用
PDO
。在一个地方,他们有一些
锁表
命令来防止两个用户同时访问相同的数据。运行
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);
}
我还尝试在
锁定表
之前添加
$\u DB->beginTransaction
,在
解锁表
之后添加
$\u DB->commit
,但仍然得到相同的错误

我尝试了各种组合的
ATTR\u-EMULATE\u-PREPARES
MYSQL\u-ATTR\u-USE\u-BUFFERED\u-QUERY
,但似乎没有什么不同。

你应该改用
QUERY()
exec()
不需要任何返回值,这正是
锁表所需要的

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

请不要仅仅为了打印错误消息而捕获异常。不要理会异常,或者在需要时重新引用它。谢谢@Dharman-很高兴知道。很高兴知道为什么代码需要锁?可能有一种方法可以在没有锁的情况下进行同样的操作。我认为它是用来确保如果两个人试图同时编辑一个检查,那么在检查是否有人在编辑它和更新说我在编辑它之间不会有竞争条件。