最近在项目中经常会出现数据库操作失败的,日志抛出的错误的 Commands out of sync; you can't run this command now。但是把具体的这条sql语句放到可视化工具里面执行却并没有什么问题。所以sql语句并没有什么语法的问题,mysql官方对这个错误的解释是:
If you get
Commands out of sync; you can't run this command now
in your client code, you are calling client functions in the wrong order.This can happen, for example, if you are using
mysql_use_result()
and try to execute a new query before you have calledmysql_free_result()
. It can also happen if you try to execute two queries that return data without callingmysql_use_result()
ormysql_store_result()
in between.
大概的意思就是说你在使用 mysql_use_result()
之前并没有调用mysql_free_result(),或者是你尝试执行两次查询,但是在两次查询的中间你并没有对返回数据调用
mysql_use_result()
ormysql_store_result()就行处理。
排查了所有的带结果集的sql操作,也都进行了mysql_free_result。多次定位发现,程序是调用了一个多条update语句拼接的一个sql命令。 这条update语句是执行成功了,但是却导致了后续的所有mysql错误都是抛出Commands out of sync; you can't run this command now
的错误。
在mysql在connect函数中可以指定
CLIENT_MULTI_STATEMENTS 选项来一次执行通过分号分割的多条sql语句。通过查阅资料发现对于一次执行多条update(或者insert)这类无结果集的sql操作我们也需要对其进行ysql_free_result,在sql语句执行完后加上下面的代码便解决该问题
do
{
result = mysql_store_result( mysql );
mysql_free_result(result);
}while( !mysql_next_result( mysql ) );
有点奇怪,为什么result明明获取出来是NULL,但还是要执行mysql_free_result操作。希望有明白之人可以讲解一下