MySQL MYISAM проблема параллелизма с двумя процессами - PullRequest
0 голосов
/ 29 апреля 2009

Я, вероятно, упустил что-то простое, но я пытался понять, что здесь происходит не так в течение нескольких недель, и мне нужен свежий взгляд.

У меня есть приложение CGI, которое обрабатывает уведомления о платежах Paypal. Когда кто-то подписывается, я фактически получаю IPN подписки, за которым следует IPN оплаты. Прямо за другим, поэтому я запускаю два процесса CGI. Я создаю отдельный журнал для каждой из них, и метки времени идентичны (с разрешением метки времени - секунды).

Приложение CGii предназначено для создания учетной записи пользователя для нового подписчика, а затем платежный IPN добавляет информацию во вновь созданную учетную запись. Достаточно просто.

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

Теперь отметки времени показывают, что функция, которая создает учетную запись для первого IPN, возвратилась до того, как второй IPN начинает ее искать, что означает, что INSERT завершена до того, как будет выпущен первый SELECT. Не повезло.

Я задавался вопросом, было ли это кешированием: http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html Но я так не думаю.

Здесь я вообще не использую TRANSACTIONS, но я не освобождаю дескриптор для первого приложения CGI до того, как второе выдаст свой SELECT, но это не должно иметь значения. Я думаю, я мог бы попытаться выдать, я, вероятно, упустил что-то простое, но я пытался понять, что здесь происходит не так в течение нескольких недель, и мне нужен свежий взгляд.

У меня есть приложение CGI, обрабатывающее платежные уведомления Paypal. Когда кто-то подписывается, я фактически получаю IPN подписки, за которым следует IPN оплаты. Прямо за другим, поэтому я запускаю два процесса CGI. Я создаю отдельный журнал для каждой из них, и метки времени идентичны (с разрешением метки времени - секунды).

Приложение CGii предназначено для создания учетной записи пользователя для нового подписчика, а затем платежный IPN добавляет информацию во вновь созданную учетную запись. Достаточно просто.

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

Теперь отметки времени показывают, что функция, которая создает учетную запись для первого IPN, возвратилась до того, как второй IPN начинает ее искать, что означает, что INSERT завершена до того, как будет выпущен первый SELECT. Не повезло.

Я задавался вопросом, была ли это проблема с кешированием: http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html Но я так не думаю.

Я не использую СДЕЛКИ, но я не пытался выдать COMMIT после ВСТАВКИ.

Что мне здесь не хватает?

1 Ответ

1 голос
/ 30 апреля 2009

Таблицы MYISAM не поддерживают транзакции, поэтому проблем не будет. Без какого-либо кода, на мой взгляд, честно звучит так, будто ваш второй запрос использует неправильный идентификатор. Что вы регистрируете помимо меток времени? Я бы регистрировал все запросы и проверял, чтобы идентификаторы соответствовали и чтобы второй запрос искал нужную запись. Возможно, попытайтесь воспроизвести ситуацию вручную, используя только SQL, и оставьте сценарии вне нее, пока вы тестируете свои запросы.

...