> > Bonjour,

Bonjour,

>
> > Je viens de transférer un site vers un nouveau serveur.
>
> > Sur ce serveur certaines données, comme les comptes utilisateurs, sont
> > dupliquées lors de l'enregistrement.
>
> > Les enregistrement sont effectuées à la même seconde à chaque fois, sur
> > des modele qui ont des regles de validation d'unicité sur certains
> > enregistrements.
> > (validates_uniqueness_of :email , :on => :create)
>

Attenton validate_uniqueness n'est pas garantie absolue d'unicité car
ton opération n'est pas atomique

En effet le pattern:

Requête 1: Test uniqueness => OK
Requête 2: Test uniqueness => OK
Requête 1: Insert user
Requête 2: Insert user => duplication du user

Est tout à fait possible, le seul moyen fiable de garantir l'unicité
c'est de gérer la contrainte au niveau de la base de donnée.

Ce genre de pattern d'erreur est plus probable d'arriver si ta
création de user se fait en ajax sans invalidé le bouton de submit et
que cette requête est particulièrement lente (FULL SCAN ?) car dans ce
cas là tes utilisateurs seront plus prompt à cliquer 2 fois sur submit
et comme tes requêtes sont lente le cas décrit est plus succeptible
d'arriver.

Un cas qui pourrait avoir tendance à empirer le nombre d'occurrence de
ce pattern est l'utilisation de table innodb avec des transactions. Le
commit ne se faisant qu'à la fin et si je ne m'abuse comme il n'y a
pas de table locking mais du row locking, si une 2ème requete arrive
en demandant la création du user tu es marron car comme ce n'est pas
commit le test d'unicité passe. A vérifier, j'utilise surtout du
myisam donc je dis peut-être des innepties.

> > J'ai pu voir qu'il n'y avait pas la gem mysql d'installée, est ce qu'il
> > est possible que le problème vienne de là ?
>
> il me semble que si la gem mysql n'est pas installée , tu n'as pas de
> connexion à ta base donc l'application ne fonctionne pas.
>
> donc a priori non.

Faux, jusqu'à Rails 2.1.x tu as un connecteur bundle avec Rails. Il
est moins performant mais n'est pas buggé à ce point là.
A partir de Rails 2.2, sans gem mysql ca plantera par contre.

Renaud
--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe "Railsfrance" de 
Google Groups.
Pour transmettre des messages à ce groupe, envoyez un e-mail à l'adresse 
[email protected]
Pour résilier votre abonnement envoyez un e-mail à l'adresse [EMAIL PROTECTED]
-~----------~----~----~----~------~----~------~--~---

Répondre à