2009-06-10 5 views
0

Mon application Web permet aux utilisateurs de télécharger plusieurs photos simultanément sur le serveur, puis de les stocker dans une base de données. Lorsque la première photo aura fini de télécharger, elle devrait créer un album par défaut basé sur la date du jour, et l'ajouter à cela. Mais si photo1 se termine, cherche l'album, et ne le trouve pas alors il décide de le créer, mais avant qu'il le puisse, photo2 se termine et ne peut pas le trouver, alors ils essayent tous les deux de créer le même album, provoquant l'échec? Ce serait probablement très peu probable, mais cela pourrait arriver, je pense. Ou est-ce que la plupart des serveurs Web ne traitent qu'un seul script PHP à la fois?Gestion des envois simultanés sur la base de données

Serait-ce une solution valide et bonne ?: Au lieu de photo1 vérifier si l'album existe d'abord, il essaie juste de le créer. Si elle renvoie une erreur 1062 (entrée dupliquée), ALORS elle la sélectionne. Ensuite, peu importe ce qui finit en premier si vous y réfléchissez ... Je ne sais pas si les erreurs de capture seront un gros succès. Si je télécharge 200 photos, 199 d'entre elles échouent la requête d'insertion, puis essayez de sélectionner. Si l'autre solution fonctionne correctement, 199 réussira et l'un manquera.

Pensées?

+0

Quelle version de MySQL utilisez-vous? Quel moteur utilisent vos tables? InnoDB? MyISAM? – raspi

+0

@raspi: vesion 5.1.30, les tables sont MyISAM. Je n'ai jamais compris ce que cela signifie réellement. – mpen

Répondre

1

Combiner les deux

Vérifiez si elle existe et si elle ne se joindre à

sinon essayer de créer un

si cela ne marche pas le travail commence tout cela à nouveau

+0

Je pensais à cela aussi en réalité. Cela signifie une ou deux lignes de code supplémentaires, mais je suppose qu'ils ne seront jamais exécutés dans 99% des cas. Je suppose que c'est logique: p – mpen

1

Nous avons quelque chose de similaire, mais pas de photos, mais nous attendons simplement que TOUS les articles soient envoyés avant de les traiter. Cela signifie qu'il faut d'abord les garder dans une zone de transit, mais cela résout l'autre problème.

+0

Ooh ... Je n'aime vraiment pas cette solution :) Pas que ce soit mauvais, mais je veux faire d'autres choses avec les photos immédiatement. +1 pour une solution potentiellement valide compte tenu de ma description si – mpen

1

Pourquoi ne pas créer la l'album en premier, et ne l'affiche que s'il contient du contenu?

Ainsi, votre logique de script ressemblerait à quelque chose comme:

create album<date> 
while more images 
    upload next image 
    add to album<date> 
voila 

De cette façon, s'ils font un album et ne l'utilisent pas, il affiche jamais. Vous pouvez urn un script de maintenance pour nettoyer tous les albums vides un jour ou si longtemps après.

1

Voici à quoi servent la gestion des transactions et la synchronisation. Si votre langage (PHP) ne fournit pas la gestion et la synchronisation des transactions, vous pouvez utiliser la base de données elle-même pour prendre soin de cela pour vous.

Je pense que vous avez déjà ceci - chaque demande devrait vérifier pour s'assurer que c'est la tentative de créer l'album réussit. Si cela échoue, il peut alors vérifier si un autre processus/demande l'a déjà créé, puis l'utiliser.

Questions connexes