461 votes

Obtenir « attente de verrouillage délai d’attente dépassé ; Essayez de redémarrer transaction » même si j’ai ' m n'utilise pas de transaction

J’ai essaye le simple suivant `` déclaration :

Je n’utilise pas une transaction, alors pourquoi serait j’obtenir cette erreur ? J’ai même essayé de redémarrer mon serveur MySQL, et il n’a pas aidé.

La table comporte des lignes 406 733, FYI.

541voto

Eric Leschinski Points 14289

La FORCE de DÉVERROUILLAGE POUR certains verrouillé tables dans MySQL:

1) Entrez MySQL

mysql -u your_user -p

2) voyons voir la liste des tables verrouillées

mysql> show open tables where in_use>0;

3) nous allons voir la liste des processus en cours, l'un d'eux est le verrouillage de votre table(s)

mysql> show processlist;

4) Tuer l'un de ces processus

mysql> kill put_process_id_here;

282voto

MarkR Points 37178

Vous êtes à l'aide d'une transaction; autocommit ne désactive pas les transactions, il est tout à fait automatiquement s'engager à la fin de l'instruction.

Qu'est-ce que se passe, c'est un autre thread est la tenue d'un verrouillage d'enregistrement sur certains dossier (mise à jour chaque enregistrement de la table!) pendant trop longtemps, et votre fil est en train d'être dépassé.

Vous pouvez voir plus de détails de l'événement par l'émission d'un

SHOW ENGINE INNODB STATUS\G 

après l'événement. Idéalement ce faire, au calme sur un test de la machine.

158voto

veen Points 239
mysql> set innodb_lock_wait_timeout=100

Query OK, 0 rows affected (0.02 sec)

mysql> show variables like 'innodb_lock_wait_timeout';
+--------------------------+-------+
| Variable_name            | Value |
+--------------------------+-------+
| innodb_lock_wait_timeout | 100   |
+--------------------------+-------+

Maintenant déclencher de nouveau le verrou. Vous avez 100 secondes de temps SHOW ENGINE INNODB STATUS\G de la base de données et voir qui d'autres de la transaction est le verrouillage de la vôtre.

110voto

saisyukusanagi Points 81

Jetez un coup d'oeil si votre base de données est affiné. En particulier les opérations d'isolation. N'est-ce pas une bonne idée d'augmenter le innodb_lock_wait_timeout variable.

Vérifiez votre base de données niveau d'isolation de transaction dans la base de données mysql de la cli:

mysql> SELECT @@GLOBAL.tx_isolation, @@tx_isolation, @@session.tx_isolation;
+-----------------------+-----------------+------------------------+
| @@GLOBAL.tx_isolation | @@tx_isolation  | @@session.tx_isolation |
+-----------------------+-----------------+------------------------+
| REPEATABLE-READ       | REPEATABLE-READ | REPEATABLE-READ        |
+-----------------------+-----------------+------------------------+
1 row in set (0.00 sec)

Vous pourriez obtenir des améliorations de changer de niveau d'isolation, l'utilisation de l'oracle comme LIRE COMMIS au lieu REPEATABLE READ (InnoDB par Défaut)

mysql> SET tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> SET GLOBAL tx_isolation = 'READ-COMMITTED';
Query OK, 0 rows affected (0.00 sec)

mysql> 

Également essayer d'utiliser SELECT POUR mettre à JOUR uniquement si nécessaire.

12voto

James C Points 9120

100% avec ce que MarkR dit. autocommit fait de chaque déclaration, une déclaration de transaction.

SHOW ENGINE INNODB STATUS devrait vous donner quelques indices quant à l'impasse de la raison. Avoir un bon look à votre slow query log trop à voir ce qu'est l'interrogation de la table et essayer d'enlever tout ce qui fait une analyse complète de la table. Le verrouillage de niveau ligne fonctionne bien, mais pas quand vous êtes à essayer de verrouiller toutes les lignes!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X