【问题标题】:Without SELECT: Cannot execute queries while other unbuffered queries are active (INSERT INTO/ANALYZE TABLE/BEGIN TRANSACTION)没有 SELECT:在其他无缓冲查询处于活动状态时无法执行查询(INSERT INTO/ANALYZE TABLE/BEGIN TRANSACTION)
【发布时间】:2019-11-06 00:47:09
【问题描述】:

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

  1. PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 已开启
  2. 我不使用 pdo 的 query(),只使用 exec()。

我认为“分析表”存在问题。它返回一个带有 on 行的结果集。我不需要这些信息。我无法更改 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 中的错误?

【问题讨论】:

  • 我真的希望你的 pdo() 函数返回一个静态实例,而不是每次调用它时都创建一个新的连接。
  • 你为什么要ANALYZE TABLE? (问题的另一个解决方案是摆脱ANALYZE。)
  • 没有 ANALYZE 性能很弱。

标签: php mysql pdo mariadb


【解决方案1】:

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

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

【讨论】:

  • 但是通常 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => 1 抑制这个?
  • PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 不会“抑制”任何东西。它只是一个帮助程序员实现特定目标的配置选项。没有旨在“抑制”程序员故意犯的错误的参数。
  • 没错,它只是配置结果集不在数据库服务器上。 “...立即从 MySQL 服务器转移到 PHP...”。这通常使 fetchAll() 变得不必要。
猜你喜欢
  • 2014-09-18
  • 2011-01-05
  • 1970-01-01
  • 2015-03-28
  • 1970-01-01
  • 2017-11-09
  • 2015-03-19
相关资源
最近更新 更多