Comment éviter les doublons lors d'inscriptions simultanées ?

posée 4 months ago268 vuesfr

1

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.

Diagnostic IA

Généré par IA. Ce n'est pas une réponse — la communauté ci-dessous le confirme ou le corrige. Vérifiez toujours avant de vous y fier.

posée 4 months ago

1 réponse

9
✓
✓ Réponse acceptée

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.

Connectez-vous pour dire si ça a marché.

answered 4 months ago

Sign in and verify your email to post an answer.