J'ai quelques anomalies sur un projet : une personne inscrite deux fois à un même évènement.
En principe, lorsqu'une demande d'inscription est faite, je vérifie d'abord dans le script PHP que la personne n'est pas déjà inscrite sur cet évènement, en interrogeant la BDD et seulement si la requête ne me retourne rien, j'insère l'inscription en BDD.
Mais là j'ai des inscriptions très rapprochées (de l'ordre du quart de seconde), et je suppose que lorsque la seconde demande est examinée, la première n'a pas encore été traitée, et donc la première comme la deuxième interrogation en BDD laissent penser que la personne n'est pas déjà inscrite.
Je ne sais pas trop comment apparaît cette double requête : un double clic éclair, un problème réseau, un navigateur qui bégaye ? sachant qu'elle est envoyée par le navigateur lui-même, pas par un script JS. Quoiqu'il en soit, ce n'est pas tout à fait isolé, j'ai détecté 3 doublons, sur environ 2000 entrées. Ça arrive rarement, mais ça arrivé suffisamment régulièrement pour que je ne puisse ignorer le problème.
Comment gérer ça ?
Créer un index
Utiliser une requête du style
Utiliser des verrous de table ? A priori c'est fait pour ça, mais je n'y suis guère habitué… comment sont gérés les demandes faites en parallèle, sont-elles rejetées en raison du verrou apposé par ailleurs ou bien mises en attente le temps que le verrou soit levé ?
En principe, lorsqu'une demande d'inscription est faite, je vérifie d'abord dans le script PHP que la personne n'est pas déjà inscrite sur cet évènement, en interrogeant la BDD et seulement si la requête ne me retourne rien, j'insère l'inscription en BDD.
Mais là j'ai des inscriptions très rapprochées (de l'ordre du quart de seconde), et je suppose que lorsque la seconde demande est examinée, la première n'a pas encore été traitée, et donc la première comme la deuxième interrogation en BDD laissent penser que la personne n'est pas déjà inscrite.
Je ne sais pas trop comment apparaît cette double requête : un double clic éclair, un problème réseau, un navigateur qui bégaye ? sachant qu'elle est envoyée par le navigateur lui-même, pas par un script JS. Quoiqu'il en soit, ce n'est pas tout à fait isolé, j'ai détecté 3 doublons, sur environ 2000 entrées. Ça arrive rarement, mais ça arrivé suffisamment régulièrement pour que je ne puisse ignorer le problème.
Comment gérer ça ?
Créer un index
unique
sur le coupe id du participant / id de l'évènement ? Ça devrait bloquer toute insertion d'un doublon, et gérer côté php l'erreur générée, ou, mieux, avec INSERT IGNORE
.Utiliser une requête du style
INSERT INTO … SELECT … WHERE NOT EXISTS ( SELECT … )
?Utiliser des verrous de table ? A priori c'est fait pour ça, mais je n'y suis guère habitué… comment sont gérés les demandes faites en parallèle, sont-elles rejetées en raison du verrou apposé par ailleurs ou bien mises en attente le temps que le verrou soit levé ?