Premièrement, les interblocages ne dépendent pas du verrouillage explicite. La TABLE DE VERROUILLAGE de MySQL ou l'utilisation de modes d'isolation de transaction autres que ceux par défaut ne sont PAS nécessaires pour avoir un blocage. Vous pouvez toujours avoir des interblocages si vous n'utilisez jamais de transaction explicite.
Les blocages peuvent se produire sur une seule table, assez facilement. Le plus souvent, cela provient d'une seule table active.
Les blocages peuvent même arriver si toutes vos transactions ne font qu'insérer une seule ligne.
Un blocage peut se produire si vous avez
- Plusieurs connexions à la base de données (évidemment)
- Toute opération qui implique en interne plus d'un verrou.
Ce qui n'est pas évident, c'est que la plupart du temps, une seule insertion ou mise à jour de ligne implique plus d'un verrou. La raison en est que les index secondaires doivent également être verrouillés lors des insertions / mises à jour.
Les SELECT ne se verrouillent pas (en supposant que vous utilisez le mode d'isolation par défaut et que vous n'utilisez pas FOR UPDATE), ils ne peuvent donc pas en être la cause.
SHOW ENGINE INNODB STATUS est votre ami. Cela vous donnera un tas d'informations (certes très déroutantes) sur les blocages, en particulier le plus récent.
- Vous ne pouvez pas complètement éliminer les interblocages, ils continueront à se produire en production (même sur les systèmes de test si vous les stressez correctement)
- Visez un très faible nombre de blocages. Si 1 % de vos transactions se bloquent, c'est peut-être trop.
- Envisagez de modifier le niveau d'isolement de vos transactions en lecture validée SI VOUS COMPRENEZ PLEINEMENT LES IMPLICATIONS
- assurez-vous que votre logiciel gère les interblocages de manière appropriée.