SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 20.06.2011 11:34:53

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Последовательность выполнения запросов

В php создаётся connection и выполняются 3 запроса.

$db=new myDB();
$db->query('CALL Procedure1()');
$db->query('CALL Procedure2()');
$db->query('TRUNCATE temp_table');
$db->close();

Содержимое:

Procedure1
DECLARE c1 CURSOR FOR     select id,points from temp_table;
...
cursor_loop:LOOP   FETCH c1 INTO id,points;
...
    UPDATE stat_table1,temp_table SET stat_table1.points=stat_table1.points+temp_table.points WHERE stat_table1.id=temp_table.id

END LOOP cursor_loop;


Procedure2
DECLARE c1 CURSOR FOR     select id,points from temp_table;
...
cursor_loop:LOOP   FETCH c1 INTO id,points;
...
    UPDATE stat_table2,temp_table SET stat_table2.points=stat_table2.points+temp_table.points WHERE stat_table2.id=temp_table.id

END LOOP cursor_loop;

Query
TRUNCATE temp_table;

То есть из таблицы temp_table данные добавляются в таблицы stat_table1 и stat_table2, после чего temp_table очищается.
Обычно всё работает хорошо, но иногда бывают случаи когда stat_table2 не идентичен с stat_table1, а конкретно в stat_table2 не хватает данных. При этом TRUNCATE срабатывает всегда.

Что это может быть ?
Может быть что $db->query('TRUNCATE temp_table'); срабатывает раньше чем $db->query('CALL Procedure2()'); заканчивает свою работу ?

Неактивен

 

#2 20.06.2011 13:58:13

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

Re: Последовательность выполнения запросов

Одновременно два потока не могут работать?

Неактивен

 

#3 20.06.2011 14:21:25

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Последовательность выполнения запросов

DECLARE c1 CURSOR FOR     select id,points from temp_table;
...
cursor_loop:LOOP   FETCH c1 INTO id,points;
...
    UPDATE stat_table1,temp_table SET stat_table1.points=stat_table1.points+temp_table.points WHERE stat_table1.id=temp_table.id
    UPDATE stat_table2,temp_table SET stat_table2.points=stat_table2.points+temp_table.points WHERE stat_table2.id=temp_table.id

END LOOP cursor_loop;

TRUNCATE temp_table;

Поставил 2 апдейта в один loop и всё разместил в одной процедуре. Теперь все работает гладко.

Вопрос почему не работало с отдельными запросами ?

Неактивен

 

#4 20.06.2011 17:18:59

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

Re: Последовательность выполнения запросов

Одновременно два потока не могут работать?

Неактивен

 

#5 20.06.2011 19:22:54

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Последовательность выполнения запросов

paulus написал:

Одновременно два потока не могут работать?

Если вы имеете виду, одновременно 2 запущенных скрипта, то нет.

Неактивен

 

#6 20.06.2011 19:54:33

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

Re: Последовательность выполнения запросов

Тогда, боюсь, надо дебажить. Сходу не вижу причин расхождения.

Неактивен

 

Board footer

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