Je reporte ici une conversation de la zone qui a probablement sa place ici.
je suis en train d'étudier plusieurs options pour régler un problème de concurrence de requêtes qui génère très souvent des doublons dans des réponses à des formulaires à réponse unique sur Formidable.
J'explique rapidement le contexte, mais ça pourrait faire l'objet d'un autre thread dans la Zone. Une personne qui valide plusieurs fois un formulaire Formidable sans en attendre le résultat peut très bien créer autant de réponses dans la table spip_formulaires_reponses, qu'il a cliqué sans attendre la réponse.
J'ai proposé à RastaPopoulos, en MP, de créer un nouveau champ contenant un hash unique (une clé SQL) dans la table spip_formulaires_reponses. Ça ferait échouer un deuxième INSERT avec le même hash et empêcherait la duplication des réponses.
L'autre solution, qui m'amène à écrire ce courriel, est de régler le problème via des transactions SQL. On ouvre une transaction, on fait notre insert, on referme. Pas de possibilité de faire d'autres opérations en base tant que le COMMIT n'est pas fait.
Je suis tombé sur cette page sur le web :
http://code.spip.net/autodoc/tree/ecrire/base/abstract_sql.php.html#function_sql_demarrer_transactionoù il y a bien deux fonctions sql_demarrer_transaction() et sql_terminer_transaction() qui ont l'air de faire ça, même si elles ne sont pas documentées. En fouillant les sources, les fonctions sont disponibles pour SQLite, mais pas pour les bases MySQL, qui sont également sensées gérer les transactions.
Est-ce que c'est pour une bonne raison que les fonctions de transaction ne sont pas implémentées sous MySQL ? Quelqu'un s'y serait-il déjà frotté et aurait-il battu en retraite ?
En admettant que je modifie Formidable pour utiliser ces fonctions, et que je les implémente pour SPIP, Formidable deviendrait dépendant de la toute dernière version de SPIP ce qui risque de casser la compatibilité sur beaucoup de site.
Est-ce que vous pensez que le problème du "clic frénétique" serait quelque chose à régler directement au niveau de SPIP ?
Est-ce qu'il n'y aurait pas de limitations à mettre directement au niveau du mécanisme CVT par exemple ?
J'avais aussi parlé en MP d'une solution Javascript, à savoir un clic sur un bouton "Envoyer" invaliderait le bouton en lui-même (disabled). Ça limiterait les fausses manipes. Par contre, le contrôle étant effectué côté client, ça ne mettrait pas à l'abri des malversations.
Ci-dessous, la réponse de RastaPopoulos (désolé si la structure de ce courriel est un poil brouillonne).