2010-10-18 21 views
1

J'ai entendu parler de ce problème et maintenant je cherche des informations plus spécifiques?Comment résoudre les problèmes avec les blocages dans le moteur InnoDB?

Comment cela se passe-t-il, quelles sont les raisons pour cela, explication détaillée du mécanisme de l'impasse pour essayer de l'éviter. Comment détecter le blocage, le résoudre et protéger les données d'être corrompu à cause de cela. L'affaire est lors de l'utilisation de MySQL avec PHP. Puis-je mélanger l'InnoDB et MyISAM?

J'ai l'intention d'utiliser innoDB pour certains majo rtables avec beaucoup de relations et pas beaucoup de données, comme utilisateurs, rôles, privilèges, entreprises, etc. et utiliser MyISAM pour les tables qui contiennent plus de données: données clients, données d'actions, etc. pour n'utiliser que InnoDB, mais le passage de MyISAM m'effraie un peu en termes de vitesse et de stabilité. Et maintenant cette DEADLOCKS :(

+0

Il ne devrait pas y avoir de problème pour passer de MyISAM à InnoDB, si vous n'avez pas besoin d'une fonctionnalité spécifique à MyISAM, comme la recherche Fulltext ou la table complète rapide 'COUNT (*)' s. MyISAM est *** pas *** plus rapide que InnoDB, InnoDB n'est pas plus rapide que MyISAM. L'un se comporte mieux dans une occasion, l'autre dans une autre. En fait, je suis passé à InnoDB parce que c'était beaucoup plus performant sur les tables avec beaucoup d'écritures, car il utilise le verrouillage de niveau de ligne au lieu du verrouillage de niveau table de MyISAM. Donc, si vous n'avez pas besoin d'une fonctionnalité spécifique à MyISAM, ne craignez pas de changer;) – NikiC

+0

qu'en est-il de l'impasse qui pourrait être ma principale douleur dans un ** je vais à InnoDB. J'ai déjà utilisé ce moteur mais jamais sur une grosse DB. Maintenant, je suis workign sur une application qui utilise de nombreux DB (plus de 40), chacun d'entre eux est de 10-20 Mo. Ce n'est pas beaucoup, mais il y a encore beaucoup de données. –

Répondre

2

peut se produire si interblocages vous avez deux ou plusieurs requêtes indépendantes ayant accès aux mêmes ressources (tables/lignes) en même temps un exemple du monde réel.

Deux mécaniciens travaillent À un moment donné pendant la réparation, ils ont tous deux besoin d'un tournevis et d'un marteau pour desserrer la partie grippée.Le mécanicien A saisit le tournevis, le mécanicien B saisit le marteau et ne peut plus continuer, comme le deuxième outil dont ils ont besoin n'est pas disponible: ils sont dans l'impasse

Maintenant, les humains sont intelligents et l'un des mécaniciens sera courtois et livrera leur outil à l'autre: les deux peuvent continuer à travailler. stupide, et aucune requête ne sera gracieuse et déverrouiller quelle que soit la ressource qui cause l'impasse. À ce stade, le SGBD va activer Rambo et forcer un retour (ou simplement tuer) une ou plusieurs des requêtes mutuellement verrouillées. Cela permettra à une requête chanceuse de continuer et d'obtenir les verrous/transactions dont elle a besoin, et nous espérons que ceux qui ont été abandonnés auront des applications suffisamment intelligentes pour les gérer, ce qui relancera les transactions plus tard. Sur les SGBD plus anciens/plus simples, le système entier s'arrêterait jusqu'à ce que le DBA soit entré et ait fait un nettoyage manuel.

Il existe de nombreuses méthodes pour gérer les interblocages et les éviter en premier lieu. Une grande est de ne jamais verrouiller les ressources dans des ordres "aléatoires". Dans le cas de notre mécanicien, les deux doivent d'abord atteindre le tournevis, avant d'atteindre le marteau. De cette façon, on peut travailler immédiatement avec succès, tandis que l'autre saura qu'il doit attendre. En ce qui concerne le mélange InnodB/MyISAM - MySQL prend entièrement en charge les types de table de mélange/correspondance dans les requêtes. Vous pouvez sélectionner/joindre/mettre à jour/insérer/supprimer/modifier dans l'ordre que vous voulez, rappelez-vous simplement que faire quoi que ce soit à une table MyISAM dans une transaction InnoDB ne rendra pas MyISAM magiquement conscient des transactions. Les parties MyISAM vont s'exécuter/commettre immédiatement, et si vous annulez le côté InnoDB des choses, MyISAM ne reviendra pas aussi bien.

La seule raison majeure de rester avec MyISAM ces jours-ci est sa prise en charge de l'indexation de texte intégral. Autre que cela, InnoDB sera généralement le meilleur choix, car il a une prise en charge complète des transactions et le verrouillage au niveau des lignes.

+0

Merci c'était une bonne réponse, mais comment éviter les blocages dans l'application? Tout exemple PHP sera utile. Est-ce que je vais avoir une impasse si j'exécute simplement quelques mises à jour, insère, sélectionne et supprime en même temps sans verrouiller aucune table du script? Je veux dire des requêtes simples, pas de LOCK TABLE ou des trucs comme ça. –

+0

Encore une question. Une impasse peut se produire seulement pendant que 2 transactions accèdent à la même ligne (s) simultanément et ont les ressources verrouillées dont ils ont besoin pour terminer la transaction. Je veux dire que je ne vois pas comment une simple requête atomique peut provoquer une impasse. Ai-je raison? –

+0

S'il n'y a pas de verrous, alors il ne peut pas y avoir un * BLOC * mort *. Toutefois, si les deux requêtes fonctionnent sur les mêmes lignes, il s'agit d'une condition de concurrence, et vous pourriez obtenir des résultats incohérents, selon l'ordre dans lequel les requêtes sont réellement exécutées. –