2009-11-30 14 views
1

J'utilise JMeter pour tester mon application Web. et mon cas de test est d'ajouter un enregistrement dans la base de données. puis j'ai mis le "nombre de thread utilisateur" à 20, cela signifie qu'il va simuler 20 utilisateurs travaillent en même temps. puis je lance le scénario de test. Mais finalement, j'ai trouvé que le système ne créait pas 20 enregistrements dans la base de données, mais créait simplement 13 enregistrements dans la base de données.Pourquoi n'a pas vu 10 enregistrements dans la base de données?

Je veux savoir pourquoi cela est arrivé? Est-ce possible parce que dans mon application web je n'ai pas ajouté de "synchronisé" devant la méthode d'ajout d'enregistrements? J'ai utilisé linq, Si deux utilisateurs postent une requête pour créer un enregistrement au serveur en même temps, que se passera-t-il? Juste créer un enregistrement ou peut créer avec succès deux enregistrements, ou inconnu?

Voici le code exemple pour créer un enregistrement dans la base de données:

 public int SaveEventGroup(int id, Models.Entities.EventGroup e, Nullable<int> setpublish) 
    { 
     try 
     { 
      Entities.EventGroup db; 
      if (id == 0) 
      { 
       db = new Entities.EventGroup(); 
       db.CreatedBy = e.CreatedBy; 
       db.CreateDatetime = DateTime.Now; 
       db.Status = true; 
      } 
      else 
      { 
       db = this.GetEventGroup(id); 
      } 

      db.NameCN = e.NameCN; 
      db.NameEN = e.NameEN; 
      db.NameZH = e.NameZH; 
      db.NamePT = e.NamePT; 
      db.DisplayOrder = GetGroupMaxDisplayOrder() + 1; 

      if (setpublish == null) 
      { 
       db.PublishStatus = false; 
       db.PublishDatetime = null; 
       db.UpdateDatetime = DateTime.Now; 
       db.UpdatedBy = e.UpdatedBy; 
      } 

      if (id == 0) 
       dataContext.AddToEventGroupSet(db); 

      dataContext.SaveChanges(); 

      return db.Id; 
     } 
     catch (Exception ex) 
     { 
      log.Error(ex.Message, ex); 
      throw ex; 
     } 
    } 
+0

Pouvez-vous publier les instructions SQL exécutées lorsque les données sont insérées dans la base de données. –

+1

Un autre message d'attente. Helloooo, MemoryLeak. Postez votre SQL! –

+0

Non, je viens d'utiliser Linq, il n'y a pas de SQL! – MemoryLeak

Répondre

0

la base de données elle-même doit être conforme ACID, donc je doute la question est à la base de données en matière de synchronisation. Si vous insérez un nouvel enregistrement et que cet enregistrement est codé par quelque chose comme un entier auto-incrémenté, la base de données ne va pas taper dessus à moins que vous lui disiez de mettre à jour par cet identifiant, plutôt que d'insérer un nouvel enregistrement. mais puisque vous n'écrivez pas le SQL, qui sait vraiment ce que vous demandez à la base de données à faire. Je suggérerais de supprimer linq de l'équation, et de l'écrire manuellement. ce que vous testez semble être une opération "upsert" très simple.

+0

oui, mais si je exploite manuellement ces cas de test, alors tout est OK, et je veux vraiment trouver une solution pour ce – MemoryLeak

+0

sons comme vous devez voir ce que sql les bits linq génèrent alors – Messy

+0

OK, laissez-moi un essayer – MemoryLeak