【问题标题】:Postgres vs MySQL: Commands out of sync;Postgres vs MySQL:命令不同步;
【发布时间】:2026-01-31 05:25:02
【问题描述】:

MySQL 场景:

当我在 MySQL 中使用多个线程执行“SELECT”查询时,我收到以下消息:“Commands out of sync; you can't run this command now”,我发现这是由于必须等待的限制“使用”结果以进行另一个查询。 C++ 示例:

void DataProcAsyncWorker::Execute()
{
  std::thread (&DataProcAsyncWorker::Run, this).join();
}
void DataProcAsyncWorker :: Run () {
  sql::PreparedStatement * prep_stmt = c->con->prepareStatement(query);
  ...
}

重要:
我无法帮助每个查询(SELECT,INSERT,ETC)使用多个线程,因为我正在构建的与 NodeJS 集成的模块“锁定”线程,直到已经获得结果,因此我需要运行后台(新线程)并解析包含从 MySQL 获得的结果的“承诺”

重要:
我正在保存几个“连接”[示例:10],并且每次 SQL 调用该函数都会选择一个连接。这是: 1. 一个包含 10 个已建立连接的连接池,例如:

for (int i = 0; i <10; i ++) {
    Com * c = new Com;
    c->id = i;
    c->con = openConnection ();
    c->con->setSchema("gateway");
    conns.push_back(c);
}


执行时出现问题> = 每秒 100 次 SELECT 查询,我相信即使连接平衡,每秒 100 个连接也是一个很高的数字,并且连接“ex: conns.at(10)”在过程并没有被消耗
我的问题:
PostgreSQL 也有这个限制吗?还是在PostgreSQL中也有这样的限制?

注意:
在关于 MySQL 的 PHP Docs 中,使用 mysqli_query 后需要 mysqli_free_result 命令,如果没有,我会收到“Commands out of sync”错误,与 PostgreSQL 文档相比,使用 pg_query 后 pg_free_result 命令是完全可选的。

也就是说,有人使用 PostgreSQL 已经遇到过与“命令不同步”相关的问题,也许这个错误还有别的名字? 或者 PostgreSQL 是否能够自动处理这个问题,因为这个原因 free_result 被服务器不可见地调用而不会导致我这个错误?

【问题讨论】:

  • 这可能更像是一个客户端库(用于 Postgres 的 libpq)和 C++ 主题,然后是一个数据库主题。
  • @a_horse_with_no_name,您好,上面的C++代码只是一个例子,问题出现在任何多线程语言或连接未被消费,例如:PHP、Java、C#或C++ 等我的问题:“PostgreSQL 也有这个限制吗?”,我想问一下 PostgreSQL 服务器上是否存在“不同步”错误或仅在 MySQL 服务器上。

标签: mysql postgresql transactions concurrency c++


【解决方案1】:

您需要在开始另一个之前完成使用一个准备好的语句(或游标或类似的构造)。

“命令不同步”通常通过添加结束语句来解决。

【讨论】:

  • 谢谢,但现在我使用的是 PostgreSQL,我的问题已经解决了。
【解决方案2】:

“问题: PostgreSQL 也有这个限制吗?还是在PostgreSQL中也有这样的限制?”

不,PostgreSQL 没有这个限制。

【讨论】: