2010-02-07 7 views
2

J'utilise un serveur mySql mis à jour toutes les 4 heures. En attendant, les données peuvent être récupérées.requêtes de base de données mySql simultanées

Est-ce que mySql gère ce scénario où la base de données est mise à jour et une requête de l'utilisateur est reçue?

ou je devrais gérer ce scénario? Est-il possible de créer un instantané de la base de données juste avant la mise à jour et d'interroger cette base de données?

Merci

Répondre

0

Si vous êtes inquiet sur la façon dont les écritures concurrentes sont gérées, c'est une chose, mais vous pouvez en toute sécurité à partir d'une base de données lire MySQL qui est mis à jour par un autre thread sans se soucier des données corrompues.

Bien sûr, si le thread d'écriture exécute plusieurs écritures qui doivent être atomiques (c'est-à-dire toutes ou aucune), assurez-vous qu'il utilise une transaction.

+0

seulement 1 fil d'écriture est disponible qui a lieu toutes les 4 heures. Le thread d'écriture extrait tous les enregistrements de la base de données. pour chaque enregistrement: il effectue une tâche et met à jour l'enregistrement avec les nouvelles données reçues. il existe donc une possibilité où l'enregistrement i est en cours de mise à jour et l'utilisateur qui possède l'enregistrement je tente d'obtenir des données de celui-ci. donc je vais lire plus sur la transaction. Est-il possible de diviser le travail entre des threads séparés en PHP? Je veux dire que la tâche pour chaque enregistrement prend environ 10 secondes et pour les problèmes de performances, je pense à diviser le travail. – embedded

+0

"donc il y a une possibilité où l'enregistrement i est en cours de mise à jour et l'utilisateur qui possède record i essaie d'obtenir des données de celui-ci." - Cela ne devrait pas vous poser de problème. En supposant que vous utilisez une transaction pour écrire les données, l'utilisateur va voir la vue de la base de données avant la mise à jour ou après, en fonction de l'ordre dans lequel les requêtes ont été reçues. Si la lecture est suivie de l'écriture, vous ne pouvez pas dire à la base de données de suspendre la lecture tant que l'écriture n'est pas terminée, mais vous n'en aurez pas besoin car l'utilisateur obtient une vue valide des données. – danben

+0

Re: PHP threads, il n'y a pas une telle chose. Vous devrez utiliser plusieurs processus. Voir http://www.alternateinterior.com/2007/05/multi-threading-strategies-in-php.html pour un exemple. – danben

0

Vous pouvez utiliser des transactions et/ou un verrouillage pour vous assurer que chaque utilisateur voit une vue cohérente (c'est-à-dire complètement mise à jour ou pas du tout mise à jour). Le moteur de base de données lui-même est très bien adapté au scénario. Si vous n'êtes pas inquiet de ce que les lecteurs voient au moment exact où les mises à jour sont en cours, vous n'avez rien à faire.

0

Compte tenu de mon scénario, je pense qu'aucune autre action n'est requise. Si l'écriture vient avant la lecture, l'utilisateur obtiendra les données les plus à jour sinon ce n'est pas le cas et il attendra la prochaine requête.

Cela correspond à mes exigences.

Merci à tous

+0

Si des réponses postées à ce sujet vous ont aidé à arriver à votre conclusion, il est généralement poli de les remettre en question et/ou de les accepter. Cela aide également les autres lecteurs à trouver des informations utiles. – danben

Questions connexes