2015-04-15 1 views
1

J'ai principalement utilisé MyISAM comme moteur de stockage dans le passé et j'utilise depuis peu InnoDB plus; et maintenant je suis à un point où je commence vraiment à travailler avec locking d'InnoDB et isolation levels.Comprendre comment gérer les blocages et leurs annulations dans InnoDB

Je lis la documentation et une chose qui me préoccupe est que it states:

InnoDB détecte automatiquement les blocages de transactions et annule une ou plusieurs transactions pour sortir de l'impasse.

En d'autres termes un code qui était censé à courir mais j'ai annulées en raison d'une impasse et tout d'un coup l'intégrité de votre données est parce que ledit code n'a pas couru !?

They also state que:

Normalement, vous devez écrire vos applications afin qu'ils soient toujours prêts à réémettre une transaction si elle est annulée à cause d'une impasse.

Le problème est qu'il n'explique pas comment de réémettre les requêtes ou test s'ils ont échoué à cause d'une impasse? Cela me semble être un problème important qu'une partie de votre code que vous prévoyez d'exécuter (les requêtes soient exécutées) peut être annulée et ne pas être réémise) sans que vous ayez ajouté du code pour éviter cela. Cela ne devrait-il pas être automatique?

Donc, quelqu'un peut-il m'expliquer ici quelle est la meilleure façon de gérer cela ou si je ne comprends pas quelque chose.

Répondre

2

code qui était censé fonctionner mais j'ai annulées en raison d'un blocage

vrai. D'où votre prochaine citation au sujet de devoir réexécuter. La réexécution de la transaction implique que votre code revienne au START TRANSACTION et réessayez. La réémission n'est pas automatique. vous avez besoin de code supplémentaire.

Assurez-vous de vérifier les erreurs, même sur BEGIN et COMMIT. En ce qui concerne le code ... Cela dépend de l'API que vous utilisez. Certains ont déjà la syntaxe try/catch; certains ne le font pas.

Faites attention de ne pas entrer dans une boucle infinie. (Exemple, si vous "bouclez jusqu'à aucune erreur", et que l'erreur est autre que "blocage", par exemple "connexion perdue".)

Si vous n'avez jamais plusieurs utilisateurs connectés à la fois, les blocages sont impossible, mais d'autres erreurs, certaines transitoires, sont possibles.

Comme pour isolation levels, je suggère de laisser à la valeur par défaut. Seulement si vous entrez dans des taux élevés de transactions et faites des choses spéciales, vous devrez peut-être changer le niveau.

+0

Donc, si je voulais les réémettre, j'exécuterais simplement les requêtes dans une boucle pendant x fois ou jusqu'à ce qu'il réussisse? – Brett

+0

Oui. Je recommande 2-3 fois, puis donne une erreur fatale. Si cela ne réussit pas au second essai, il y a probablement autre chose qu'un simple blocage qui cause des problèmes, et vous devez l'étudier. –