Comment éviter les doublons lors d'inscriptions simultanées ?
poze 4 months ago263 gadefr
Mon code vérifie SELECT ... WHERE email = ? puis fait INSERT si rien n'existe. Pourtant j'ai des comptes en double avec le même e-mail, sans doute quand deux requêtes arrivent en même temps.
Dyagnostik IA
Se IA ki fè l. Se pa yon repons — kominote a anba a konfime oswa korije l. Toujou verifye anvan ou fye l.
1 Repons
C'est une condition de course classique (*check-then-act*) : les deux requêtes font le SELECT avant que l'une ou l'autre ait inséré.
La seule vraie solution est de laisser la base de données garantir l'unicité :
CREATE UNIQUE INDEX users_email_unique ON users (lower(email));
Puis, côté application, insère directement et gère le conflit :
INSERT INTO users (email, ...) VALUES ($1, ...)
ON CONFLICT DO NOTHING
RETURNING id;
Si aucune ligne n'est retournée, l'e-mail était déjà pris : renvoie 409. Avec un ORM, attrape l'erreur de violation d'unicité (code Postgres 23505, Prisma P2002).
L'index sur lower(email) évite aussi le doublon Ruth@ex.ht / ruth@ex.ht. Nettoie d'abord les doublons existants, sinon la création de l'index échouera.
Konekte pou di lòt moun si li te mache.
Sign in and verify your email to post an answer.