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

poze 4 months ago264 gadefr

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.

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.

poze 4 months ago

1 Repons

9
✓
✓ Repons yo aksepte

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.

answered 4 months ago

Sign in and verify your email to post an answer.