如果没有SELECT:在其他无缓冲查询处于活动状态(插入表/分析表/开始进行交易)时无法执行查询

时间:2019-06-24 08:34:35

标签: php mysql pdo mariadb

我得到了错误: 常规错误:2014当其他无缓冲查询处于活动状态时,无法执行查询。考虑使用PDOStatement :: fetchAll()。另外,如果您的代码只打算针对mysql运行,则可以通过设置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。 但是:

  1. PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY已打开
  2. 我不使用pdo的query()而是exec()。

我认为“ ANALYZE TABLE”存在问题。它返回带有行的结果集。我不需要这些信息。我无法更改sql命令的顺序,因为实际上,cron作业在夜间调用了另一个批处理...

测试代码:

pdo()->exec("TRUNCATE TABLE test;");
pdo()->exec("INSERT INTO test SELECT id FROM data");
//    pdo()->exec("INSERT INTO test VALUES (1)"); if only VALUES(..) is used no error thrown
pdo()->exec("ANALYZE TABLE test"); // this returns 1 row
pdo()->beginTransaction(); // here comes the exception!

连接设置:

PDO::ATTR_EMULATE_PREPARES => 1
PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 1
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, lc_time_names = 'de_DE',sql_mode ='STRICT_ALL_TABLES,PIPES_AS_CONCAT', group_concat_max_len=1000000" ; 
PDO::MYSQL_ATTR_COMPRESS => 1

我实际的Workarround是:

$cmd = pdo()->query("ANALYZE TABLE test");
$cmd->closeCursor();
unset($cmd);

在10.2.22-MariaDB-log或PHP版本7.2.10中是否存在任何配置错误?

1 个答案:

答案 0 :(得分:0)

  

我不使用pdo的query()而是exec()。

这正是您的问题。 Mysql不知道您是否需要结果。或更确切地说,它假设只要您提出请求,结果就会一直在等待您。因此,对返回任何数据的查询使用exec()毫无意义,这也是您收到错误的确切原因。