2009-04-29 5 views
0

J'ai probablement oublié quelque chose de simple, mais j'ai essayé de comprendre ce qui ne va pas ici pendant quelques semaines et j'ai besoin d'un nouvel ensemble d'yeux. J'ai une application CGI qui traite les notifications de paiement Paypal. Quand quelqu'un s'abonne, je reçois un IPN d'abonnement suivi d'un IPN de paiement. On est juste derrière l'autre alors je lance deux processus CGI. Je crée un journal séparé pour chacun et les horodatages sont identiques (à la résolution de l'horodatage - secondes). L'application CGii est conçue pour créer un compte d'utilisateur pour un nouvel abonné, puis l'IPN de paiement ajoute des informations au compte nouvellement créé. Assez simple.MySQL MYISAM problème de concurrence avec deux processus

Le problème est que le deuxième IPN n'est pas capable de trouver le compte. J'ai supposé que c'était parce qu'il avait fini d'être créé au moment où le deuxième IPN est allé chercher, donc j'ai retardé le deuxième IPN de 5 secondes. Les horodateurs indiquent maintenant que la fonction qui crée le compte pour le premier IPN est retournée avant que le second IPN commence à le rechercher, ce qui signifie que l'INSERT est terminé avant l'émission du premier SELECT. Pas de chance.

Je me demandais si c'était un problème de mise en cache: http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html Mais je ne pense pas.

Je n'utilise pas du tout TRANSACTIONS ici, mais je n'ai pas relâché le handle pour la première application CGI avant que la seconde ne lance son SELECT, mais cela ne devrait pas avoir d'importance. Je suppose que je pourrais essayer d'émettre un je l'ai probablement oublié quelque chose de simple, mais j'ai essayé de comprendre ce qui ne va pas ici pendant quelques semaines et j'ai besoin d'un nouvel ensemble d'yeux. J'ai une application CGI qui traite les notifications de paiement Paypal. Quand quelqu'un s'abonne, je reçois un IPN d'abonnement suivi d'un IPN de paiement. On est juste derrière l'autre alors je lance deux processus CGI. Je crée un journal séparé pour chacun et les horodatages sont identiques (à la résolution de l'horodatage - secondes). L'application CGii est conçue pour créer un compte d'utilisateur pour un nouvel abonné, puis l'IPN de paiement ajoute des informations au compte nouvellement créé. Assez simple.

Le problème est que le deuxième IPN n'est pas capable de trouver le compte. J'ai supposé que c'était parce qu'il avait fini d'être créé au moment où le deuxième IPN est allé chercher, donc j'ai retardé le deuxième IPN de 5 secondes. Les horodateurs indiquent maintenant que la fonction qui crée le compte pour le premier IPN est retournée avant que le second IPN commence à le rechercher, ce qui signifie que l'INSERT est terminé avant l'émission du premier SELECT. Pas de chance.

Je me demandais si c'était un problème de mise en cache: http://dev.mysql.com/tech-resources/articles/mysql-query-cache.html Mais je ne pense pas.

Je n'utilise pas TRANSACTIONS, mais je n'ai pas essayé d'émettre un COMMIT après l'INSERT.

Qu'est-ce qui me manque ici?

Répondre

1

Les tables MYISAM ne supportent pas les transactions, cela ne pose donc pas de problème. Sans aucun code à regarder, il me semble sincèrement que votre deuxième requête utilise le mauvais identifiant. Que consignez-vous en dehors des horodatages? Je consignerais toutes les requêtes et m'assurerais que les identifiants correspondent et que la deuxième requête recherche le bon enregistrement.Essayez peut-être de reproduire la situation manuellement en utilisant uniquement SQL, et laissez les scripts à l'extérieur pendant que vous testez vos requêtes.

+0

Excellente idée. Je vais essayer ça. Merci –

Questions connexes