Maison > base de données > tutoriel mysql > Délai d'attente du verrouillage des transactions Mysql Délai d'attente du verrouillage dépassé ; que faire ?

Délai d'attente du verrouillage des transactions Mysql Délai d'attente du verrouillage dépassé ; que faire ?

PHPz
Libérer: 2023-06-03 11:32:47
avant
3049 Les gens l'ont consulté

Scénario de problème

Environnement dans lequel le problème se produit :
1. Insérer et mettre à jour successivement la même donnée dans la même transaction ;
2. Plusieurs serveurs exploitent la même base de données ;
3. une exception a été levée, informations sur l'exception :

org.springframework.dao.CannotAcquireLockException :
### Erreur lors de la mise à jour de la base de données Cause : java.sql.SQLException : délai d'attente du verrouillage dépassé ; essayez de redémarrer la transaction

### L'erreur peut impliquer. com.*.dao.mapper.PhoneFlowMapper.updateByPrimaryKeySelective-Inline
### L'erreur s'est produite lors de la définition des paramètres
### SQL :-----Ce qui suit est l'instruction SQL et les informations sur la pile------ -

Analyse des causes

Dans le cas d'une concurrence élevée, les transactions Spring provoquent des blocages de base de données, et les opérations ultérieures expirent et lèvent des exceptions.

La base de données MySQL adopte le mode InnoDB. Le paramètre par défaut : innodb_lock_wait_timeout définit le temps d'attente du verrouillage à 50s. Une fois que le verrouillage de la base de données dépasse ce temps, une erreur sera signalée.


Solution

1. Utilisez l'instruction suivante pour rechercher les données de la transaction soumise et tuer ce fil.

select * from information_schema.innodb_trx
Copier après la connexion

2. Augmentez le temps d'attente du verrouillage, c'est-à-dire augmentez la valeur du paramètre de l'élément de configuration suivant, en secondes (s)

innodb_lock_wait_timeout=500
Copier après la connexion

3. Optimisez le processus stocké et évitez les longues attentes pour les transactions.

Informations de référence

1. Délai d'attente du verrouillage. Cela est dû au fait que la transaction en cours attend que d'autres transactions libèrent les ressources de verrouillage. Vous pouvez trouver des tables et des instructions en compétition pour verrouiller les ressources, optimiser SQL, créer des index, etc. Si cela ne fonctionne toujours pas, vous pouvez réduire de manière appropriée le nombre de threads simultanés.

2. La transaction expire en attendant le verrouillage d'une certaine table. On estime que la table est verrouillée par un autre processus et n'a pas été libérée.

Vous pouvez utiliser SHOW INNODB STATUS/G pour vérifier l'état du verrouillage.


3. Recherchez une solution et ajoutez :

TransactionDeadLockDetectionTimeOut=10000 (défini sur 10 secondes) dans la zone [ndbd default] du nœud de gestion. La valeur par défaut est 1200 (1,2 secondes)


4. détecter les blocages et répondre au jet, ou mettre fin à la situation de blocage.

InnoDB détecte automatiquement les blocages de transactions et annule une ou plusieurs transactions pour sortir de l'impasse. InnoDB essaie de sélectionner les petites transactions à annuler, où la taille d'une transaction est déterminée par le nombre de lignes insérées, mises à jour ou supprimées.

Si les paramètres innodb_table_locks=1 et autocommit=0, InnoDB fera attention aux blocages de table et aux verrous au niveau des lignes au niveau MySQL. De plus, InnoDB ne détecte pas les commandes MySQL Lock Tables et autres blocages du moteur de stockage. Vous devez définir innodb_lock_wait_timeout pour résoudre cette situation.
innodb_lock_wait_timeout est le délai d'attente nécessaire à Innodb pour abandonner les verrous au niveau des lignes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal