J'ai une question à propos de MySQL InnoDB. Par exemple: Je le tableau suivant créé:MySQL InnoDB question de blocage
mysql>CREATE TABLE IF NOT EXISTS `SeqNum`
(
`id` varchar(10) NOT NULL,
`seq_num` BIGINT(30) default 0,
PRIMARY KEY(`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.00 sec)
mysql>INSERT IGNORE INTO `SeqNum` VALUES('current',0);
Query OK, 1 rows affected (0.00 sec)
Maintenant, j'ai deux connexions MySQL à la même base de données, je les nommer en tant que fils A et B. Dans le thread A, je l'instruction SQL suivante:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql> select `seq_num` from SeqNum where `id`='current' FOR UPDATE;
+---------+
| seq_num |
+---------+
| 0 |
+---------+
1 row in set (0.01 sec)
puis, je laisse le thread A tel quel.
En fil B, je voudrais faire la même requête:
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
mysql>SELECT `current_seq_num` FROM SeqNum WHERE `id` = 'current' FOR UPDATE;
fil B jetteront un MySQL 1205 erreur après le temps d'attente lock-out: délai de verrouillage d'attente dépassé; essayez de redémarrer la transaction.
Il est logique que threadA place un verrou 'X' sur cette ligne, de sorte que le thread B ne puisse pas obtenir le 'X' de verrouillage tant que le thread A n'a pas relâché le verrou. Maintenant, ma question est: du point de vue du thread B, comment pourrais-je savoir quel thread/connexion bloque ma requête (pour obtenir le privilège 'UPDATE' pour la table 'SeqNum') quand MySQL me renvoie l'erreur 1205 ? Si threadA ne fait rien après avoir obtenu le verrou X, et que j'exécute 'show processlist' dans le thread B, tout ce que j'ai sont: plusieurs threads avec le statut 'Sleep' (je suppose qu'il y a plus de deux threads connectés à la base) , Je ne peux pas identifier quel fil a bloqué ma demande?
J'espère que j'ai clairement expliqué la question. Merci!
Oui, les deux sessions sont dans une transaction. Je viens d'ajouter la déclaration de transaction dans ma question. Ma question n'est pas de savoir pourquoi la 1ère session a bloqué la 2ème session. Mais, du point de vue de la 2ème session, comment savoir quelle session a bloqué sa requête? Bien sûr, je suppose qu'il y a plus de deux sessions. – WilliamLou
et j'ai mal lu votre question, je pensais que vous obteniez le délai d'attente immédiatement, je suis désolé! –