SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 21.09.2009 14:16:30

Anton
Участник
Зарегистрирован: 21.09.2009
Сообщений: 4

C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

Добрый день. Пишу в с++ под qnx (gcc 4.2.x, mysql 5.1).
Суть задачи такова, что часто надо делать обновления данных (update) для нескольких записей в одной таблице сразу, после чего
такие же операции для нескольких других таблиц.
в параметре подключения в mysql_real_connect в качестве флага выставляю CLIENT_MULTI_STATEMENTS.
Если в одном и том же подключении делать mysql_real_query с апдейтами друг за другом для разных таблиц,
то для первой изменения вносятся, для последуюих пишется "Commands out of sync; you can't run this command now".
Ввел мутексы для блокировки доступа к поключению mysql, ничего не меняется. даже в одном потоке если делать
запросы друг за другом, то выскакиевает такое сообщеие. Если же делать для разных подключений (массив подключений), то все
вносится правильно. Сдается мне в одном подключении не успевают вноситься одни изменения, когда на сервер приходят новые.
Как отследить статус транзакции средсвами api?

Неактивен

 

#2 21.09.2009 19:06:40

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

Commands out of sync возникает тогда, когда сервер ожидает, что клиент сделает
какое-то действие (на внутреннем уровне), а клиент делает другое. Например,
клиент просит сервер сделать выборку, а потом начинает вытягивать данные. Сервер
ожидает, что клиент вытянет все данные (т.е. дойдет до маркера «конец данных»).
Если клиент при этом запросит через то же соединение новую выборку — он получит
ошибку синхронизации.

Я полагаю, что Вы изменяете данные первым запросом, не читаете ответ сервера, и
пытаетесь изменить данные следующим.

Неактивен

 

#3 22.09.2009 15:18:48

Anton
Участник
Зарегистрирован: 21.09.2009
Сообщений: 4

Re: C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

Вот кусок кода, который в первый раз отлично выполняется, в последующие выдает ошибку, out of sync...


int res = mysql_real_query(db_handle->db,(char*)abuffer->buffer_ptr,abuffer->buffer_count);
    if(res==0)
    {
    printf("SQL UPDATE: OK\n");
    sql_res = mysql_use_result(db_handle->db);
    printf("SQL RESULT %X\n",sql_res);
    if(sql_res)
    {
    while ((sql_row = mysql_fetch_row(sql_res)));
    mysql_free_result(sql_res);
    }
    }
    else
    {printf("SQL UPDATE : ERROR\n");}
 

прочил и сделал как в документации, ничего не помогает sad

Неактивен

 

#4 22.09.2009 15:20:38

Anton
Участник
Зарегистрирован: 21.09.2009
Сообщений: 4

Re: C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

в буфере находится длинная строка вида
begin;
update ... where id=...;
update ... where id=...;
update ... where id=...;
...
update ... where id=...;
commit;

Неактивен

 

#5 22.09.2009 15:25:57

Anton
Участник
Зарегистрирован: 21.09.2009
Сообщений: 4

Re: C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

Цитирую из официальной документации:
When using mysql_use_result(), you must execute mysql_fetch_row() until a NULL value is returned, otherwise, the unfetched rows are returned as part of the result set for your next query. The C API gives the error Commands out of sync; you can't run this command now if you forget to do this!
Вот так и делаю, никакой разницы.
Таблицы myISAM.

Неактивен

 

#6 22.09.2009 16:51:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: C API Support for Multiple Statement Execution : как узнать когда завершилась обработка запроса

Попробуйте сделать совсем-совсем так, как написано в документации smile

if you enable CLIENT_MULTI_STATEMENTS or CLIENT_MULTI_RESULTS, you should process the result for every call to mysql_query() or mysql_real_query() by using a loop that calls mysql_next_result() to determine whether there are more results. For an example, see Section 21.10.12, “C API Support for Multiple Statement Execution”.

http://dev.mysql.com/doc/refman/5.1/en/ … nnect.html

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson