Question

Je suis en train de mettre en œuvre en deux phases en utilisant allouent PHP et MySQL, et à venir à court.

Le bloc principal que j'ai trouvé est que je suis incapable de stocker la ressource de connexion MySQL dans un endroit où je peux le trouver à nouveau pour la deuxième phase. Est-il possible de sérialiser une poignée de base de données?

Voici le cas, je suis en train de code:

  1. L'utilisateur envoie des données
  2. Server démarre une transaction MySQL et exécute des requêtes basées sur les données qu'il a reçues.
  3. Le serveur envoie un fichier à l'utilisateur
  4. Lorsque l'utilisateur a bien reçu le fichier, le serveur engage sa transaction. Sinon, il roule en arrière.

Cela semble exiger deux requête HTTP / cycles de réponse, donc je dois être en mesure de re-connecter à la même poignée de base de données dans la deuxième requête afin de valider la transaction. J'ai manquerais à cette partie.

Un conseil est le bienvenu, même si elle est « cela est impossible en PHP »

Était-ce utile?

La solution

Jetez un oeil à LIXA Transaction Manager (http://lixa.sourceforge.net/) il intègre PHP et MySQL partir de la version 0.9.0

Il assure le traitement des transactions distribuées et validation en deux phases fonction ainsi.

Cordialement

Ch. F.

Autres conseils

Depuis PHP requête / réponse en fonction de la mise en œuvre d'une connexion persistante DB n'est pas possbile, autant que je sache.

Vous pouvez essayer de contourner cette limitation en utilisant une sorte de mécanisme de billetterie. Vos étapes seraient:

  1. L'utilisateur envoie des données
  2. Server démarre une transaction MySQL et exécute des requêtes basées sur les données qu'il a reçues, l'attribution d'un billet « unique » à cette transaction.
  3. Le serveur envoie un fichier et le ticket à l'utilisateur
  4. Lorsque l'utilisateur a bien reçu le fichier et envoyé une autre requête contenant ce billet, le serveur engage sa transaction. Sinon, il roule en arrière.
  5. Commentaire se référant à de Cassy: après une certaine période de temps devraient être annulées pour tous ne AT engage à empêcher votre db beeing de « inondé » avec les anciennes transactions

HTH

pour répondre KB22 et rojoca, la raison pour laquelle je dois le faire de cette façon est que le « dossier » dont je parle est en fait une base de données SQLite qui finit comme un magasin de données sur un appareil mobile.

Les premiers messages de la demande de base de données SQLite mise à jour sur le serveur, qui tente de fusionner les données des tables SQLite; des problèmes surviennent lorsque l'appareil mobile ne reçoit pas avec succès une nouvelle base de données SQLite (qui reflète les changements de votre appareil mobile et tout autre nouvelles choses de l'application Web), parce qu'il tentera alors d'envoyer la même (ancienne) base de données SQLite au Web une deuxième fois, ce qui entraîne des entrées en double dans les tables web pour tout ce qui a été créé sur l'appareil mobile.

Ainsi, le Web doit être sûr que le dispositif a la nouvelle base de données avant d'engager les changements de fusion. Compte tenu des aléas des réseaux, cela ne semble possible que si l'appareil peut envoyer un accusé de réception explicite après avoir reçu la nouvelle base de données SQLite. Et que cela est possible si nous faisons deux demandes (1. La base de données SQLite pour fusionner; 2. l'accusé de réception de la réception de la nouvelle base de données SQLite sur l'appareil).

Un problème épineux en effet, et il est des informations utiles pour savoir que PHP ne peut pas manipuler la base de données gère jusqu'au niveau nécessaire.

[Je ne pense pas non plus que je peux utiliser une table de transaction parce que je dois renvoyer des données à l'appareil sur la base des tables de base de données Web « réelles ». Je pense que je vais rencontrer des problèmes avec des champs AUTO_INCREMENT si je n'ai pas utilisé les vraies tables]

Merci pour tous vos commentaires.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top