2010-09-18 5 views
0

Sur chaque page de mon site Web, un jeton est transmis en tant que paramètre de chaîne de requête. Le code côté serveur vérifie si le jeton existe déjà dans la base de données. (Le jeton est un champ uniqueidentifider dans la base de données). Si le jeton existe, il utilisera celui existant, sinon il créera une nouvelle ligne avec le nouveau jeton.Enregistrements en double de la base de données du site Web

Le problème est de temps en temps, je vois un enregistrement en double dans la base de données (deux lignes avec le même identifiant unique). J'ai remarqué que les temps d'insertion des enregistrements étaient d'environ une demi-seconde. Ma seule supposition est quand le site est visité pour la première fois les pages aspx n'ont pas été entièrement compilées. Cela prend donc quelques secondes et l'utilisateur va sur une autre page du site en tapant une URL différente et les deux requêtes ont été exécutées presque en même temps.

Existe-t-il un moyen d'empêcher ce problème d'enregistrement en double? (côté serveur ou dans la base de données ?? ...)

Ceci est le code en question qui fait partie de chaque page du site.

var record = (from x in db.Items 
      where x.Token == token 
      select x).FirstOrDefault(); 

if (record == null) 
{ 
    var x = new Item(); 
    x.Id = Guid.NewGuid(); 
    x.Token = token; 
    db.Items.InsertOnSubmit(x) 
    db.SubmitChanges; 

} 

Répondre

0

Oui, créez un index unique sur votre champ token.

create unique index tab_token on your_table(token); 

De cette façon, la base de données fera en sorte que vous ne serez jamais stocker deux enregistrements avec la même valeur token. Gardez à l'esprit que votre code peut échouer lors de l'exécution de cette contrainte en raison de la contrainte index, alors assurez-vous d'attraper cette exception dans votre code et traitez-la en conséquence. Ce qui se passe probablement, c'est que deux requêtes sont servies exactement au même moment et que certaines conditions de course font que deux jetons obtiennent la même valeur. Cela aiderait à identifier votre problème si vous postez du code.

Questions connexes