2013-03-19 3 views
1

У меня есть таблица базы данных, в которой перечислены все заказы. Каждый уик-энд работает cron, и он генерирует счета-фактуры для каждого клиента. Код проходит через каждого клиента, получает свои последние заказы, создает PDF-файл и затем обновляет таблицу заказов для записи идентификатора счета-фактуры по каждому из своих заказов.Обновление MySQL не обновляет все записи

Окончательный запрос обновления:

заказы обновления комплект выставлен счет = «12345», где имя пользователя = «тест-имя пользователя» и выставлен счет = «»;

Итак, выставите счет-фактуру на номер 12345 для всех заказов на имя для тестирования, которые еще не были выставлены счет-фактуры.

Я столкнулся с проблемой, когда заказы добавляются в PDF, но не обновляются, чтобы отразить тот факт, что они были выставлены на счет.

Я начал запускать запрос обновления вручную и встретил странный сценарий.

Клиент может иметь 60 заказов.

Если я запустил запрос один раз, то 1 заказ обновлен. Я запускаю его снова, и один заказ обновляется, я повторяю процесс, и каждый раз обновляется лишь небольшое количество заказов - от 1 до 3. Он не обновляет 60 в одном запросе, как я ожидал. Мне нужно запустить запрос несколько раз, пока он не вернется с «0 строк, затронутых», и я могу быть уверен, что все строки были обновлены.

Я не включаю LIMIT XX в мой запрос, поэтому я так не понимаю, почему он не может обновить все заказы сразу. Повторяющийся запрос повторяется каждый раз.

Есть ли у кого-нибудь мудрые предложения ?!

+0

Можете ли вы добавить запрос SELECT здесь, чтобы проверить, какие записи должны быть затронуты (например, 'SELECT * FROM bookings WHERE username =: username AND invoiced = ''') - и регистрировать результаты? – raina77ow

+0

Привет - да, это странная вещь. Если я делаю SELECT для одного и того же запроса, тогда я вижу полные результаты - например. 60 строк. Если я затем запустил обновление, тогда он будет делать только 1 или 2. – Chris

+0

Хорошо, я предполагаю, что тот же запрос выполняется нормально, когда выполняется в простой MySQL (например, через консоль) ... Можете ли вы показать сам код? – raina77ow

ответ

1

Я предполагаю, что вы используете InnoDB. Вы не указали тип кода, который вы используете.

Но я уверен, вы видите проблему, связанную с транзакциями. Когда программа работает не так, как в интерактивном сеансе, она часто является проблемой транзакции.

Смотрите здесь: http://dev.mysql.com/doc/refman/5.5/en/commit.html

ли работать вещи лучше, если вы выдаете команду COMMIT; сразу после UPDATE заявления?

Обратите внимание, что у вашего языкового связывания может быть свой собственный предпочтительный способ выдачи команды COMMIT;.

Другой способ справиться с этой проблемой является выдача команды SQL

SET autocommit = 1 

сразу же после установления соединения. Это сделает каждую команду SQL, которая изменяет данные, выполняет свою операцию COMMIT автоматически.

Смежные вопросы