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-很高兴知道。很高兴知道为什么代码需要锁?可能有一种方法可以在没有锁的情况下进行同样的操作。我认为它是用来确保如果两个人试图同时编辑一个检查,那么在检查是否有人在编辑它和更新说我在编辑它之间不会有竞争条件。