Quatre conditions qui provoquent un blocage mysql :
1. Condition mutuellement exclusive: une ressource ne peut être occupée que par un processus et ne peut pas être occupée par deux processus ou plus
2. Condition non préemptive: les ressources déjà acquises par le processus ne peuvent pas être préemptées avant d'être utilisées et ne peuvent être libérées qu'après utilisation
3. Conditions d'application de possession: le processus a déjà maintenu au moins une ressource et demandé d'autres ressources, mais cette ressource est occupée par d'autres processus, et elle ne libère pas les ressources qu'elle a déjà occupées
4. Condition d'attente cyclique: lorsqu'un blocage se produit, une boucle de processus-ressources doit être formée. Processus ensemble {p1 , p2 , p3} sont, p1 demande p2 possession des ressources, p2 demande p3 possession des ressources, p3 demande p1 ressources occupées
Solutions pour résoudre l'impasse
Le premier:
1. Demandez s'il faut verrouiller la table
affichez les tableaux ouverts où In_use> 0;
2. Processus de requête (si vous avez l' autorisation SUPER , vous pouvez voir tous les threads. Sinon, vous ne pouvez voir que vos propres threads)
afficher la liste complète des processus;
3. Tuez l' ID de processus (la colonne id de la commande ci - dessus )
tuer le processus id
Le deuxième type:
1. Affichez la transaction sous verrou
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
2. Tuez l' ID de processus (la colonne trx_mysql_thread_id de la commande ci - dessus )
tuer le processus id
Analyse:
1. Affichez le niveau d'isolement de la base de données (généralement RR : REPEATABLE-READ ):
mysql> sélectionnez @@ tx_isolation;
mysql> sélectionnez @@ global.tx_isolation;
2 , InnoDB état du moteur --- il y aura une information de blocage ( MyISAM moteur de stockage n'interblocage pas relevé)
mysql> AFFICHER LE STATUT INNODB DU MOTEUR;
3 , mysql est autocommit , il n'y aura pas de mise à jour bloquée, vérifiez la valeur de autocommit
mysql> sélectionnez @@ autocommit;
1 signifie soumission automatique. 0 signifie aucune soumission automatique.
Si vous trouvez votre base de données autocommit = 0 , corrigez-la.