Question

I ai 35 fonctions qui mettent à jour une à trois tables, dans une transaction. Cependant, ils ne se contentent pas d'exécuter des mises à jour, mais ils requêtes aussi bien.

  • Tableau 1 ne mise à jour de la ligne que les actions, et certaines requêtes.
  • Le tableau 2 fait des requêtes et des mises à jour de niveau ligne aux lignes existantes, et supprime parfois et ajoute des lignes. Le tableau 2 peut avoir des requêtes dans la transaction avant et après les suppressions de lignes et ou insertions et mises à jour.
  • Le tableau 3 fait des mises à jour de ligne sur la base des résultats du tableau 2 actions ci-dessus.

Ma première action sera pour vous assurer que la table 3 mises à jour sont toutes faites à la fin.

Le tableau 1 est indépendant des autres 2 tables, et peut probablement être le premier ou le dernier. Donc, le tableau 2 doit venir avant le tableau 3 changements.

Ma première préoccupation est que le tableau 2 actions, je fais des requêtes, puis mises à jour, puis plus de requêtes, puis mises à jour plus parfois. Dois-je reorg mon code de ne pas le faire.

Ma deuxième préoccupation est que le tableau 3 est la table avec des fils de servlet doit être rapide. Le tableau 3 est utilisé pour les requêtes simplement par lui-même. Mais il semble que les verrous de niveau ligne arrêtera ces requêtes.

Si je dois, je peux mettre l'ensemble de la table de code d'entretien décrit ci-dessus dans un seul processus à l'échelle cluster, d'un fil. La vitesse des mises à jour n'a pas d'importance. Juste que les requêtes contre le tableau 3 sont rapides. Et qu'il n'y a jamais de l'impasse.

Je ne sais pas de différences entre Oracle et InnoDB, donc j'ai des questions là-bas. (Je prévois de passer à Oracle plus tard.)

En fait, je suis à la recherche d'indications sur ce qu'il faut surveiller. Bien sûr, je pourrais forcer un verrou de table complet sur le tableau 2 et le tableau 3 au début de chaque fonction de mise à jour, mais mon fils de requête de servlet Table3 souffrirait. Donc, cela ne semble pas être une solution.

En outre, je suis inquiet juste par rapport au tableau 2 lui-même, que certaines fonctions font des requêtes, des mises à jour en fonction de la requête, de nouvelles requêtes basées sur la mise à jour, puis plus mises à jour, y compris les résultats à travers fluides mises à jour le tableau 3 . Cela semble vraiment méchant.

Recommandations? Andy

Il pourrait y avoir des mises à jour simultanées aux mêmes lignes de 2 tables, et je l'ai pris soin de frapper les tables avec les mises à jour dans le même ordre. L'une des tables a 2 indices, et semble comme un verrou de table est nécessaire pour mettre à jour l'index? Certaines des fonctions table de requêtes 1, une table de mise à jour 1, puis éventuellement interroger le tableau 2, puis mettre à jour le tableau 2, dans une boucle de répétition. Cette table contient toutes les relations entre parents et enfants dans un arbre de tout mon contenu, il est donc élevée mise à jour des volumes dans tous les utilisateurs.

Était-ce utile?

La solution

Tout d'abord, les requêtes dans Oracle (et je crois que InnoDB) ne prenez pas un verrou à moins que vous utilisez FOR UPDATE.

En second lieu, je ne reçois pas une idée de votre échelle d'application. Combien de transactions simultanées prévoyez-vous avoir? Attendez-vous les à mettre à jour les mêmes lignes?

Le genre d'application qui pourrait souffrir d'un système est des interblocages de réservation ou de billets (par exemple les personnes qui tentent de réserver les mêmes sièges dans un théâtre), en particulier dans des situations de haute concurrence (nouveau spectacle sera disponible à la réservation).

Si vous demande correspond à ce profil, alors vous ne voulez probablement anticiper les situations de blocage. Cependant, je au moins envisager de piéger simplement l'erreur, puis reculer à nouveau essayer la transaction. Si vous allez dans plus de détails dans vos structures de table, les relations et les critères de mise à jour, un point approprié pour le verrouillage peut devenir apparent.

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