0

Pendant un certain temps, je lisais sur le simultané optimiste dans NHibernate. Si ce que j'ai compris était correct, alors l'échantillon ci-dessous devrait être bon.Violation de concurrence dans l'exemple NHibernate (C#)

Considérons deux transactions T1 et T2.

  1. Lorsque T1 et T2 sont effectués en même temps, l'état (entrées DB) est mise à jour avec les valeurs de la dernière mise à jour le plus . (T1 ou T2).

Bien qu'il semble être conceptuellement solide, comment puis-je simuler ceci dans le but de comprendre et de tester l'intégration.

quelqu'un peut me aider avec un échantillon de code C#.?

Merci,

Vijay

+0

Créer deux fils. Demandez à chaque thread de faire une mise à jour. Il ne devrait pas être difficile de trouver un exemple de code pour cela. –

Répondre

0

Maintenant, après beaucoup de googler, j'ai trouvé un moyen assez simple de le faire .La suit sont les étapes pour reproduire cela.

  1. Avoir une des méthodes Thread.Sleep() entre les Get() et mise à jour(), pour un seul utilisateur (processus 1).

  2. Lorsque le processus 1 est en cours d'exécution, démarrez le processus 2 qui ne rencontre pas Thread.Sleep() et termine la mise à jour avant le processus 1.

  3. processus maintenant 2 a modifié les données dans la base de données, maintenant, quand le processus 1 met à jour les données, NHibernate renvoie une exception de l'objet renfermé.

Veuillez consulter l'extrait de code suivant.

public void Update(int empid) 
    { 
     Employee person = this.dalService.GetByEntityId(empid); 
     person.Name = "Process 1"; 

     // At this point , Update the Person table manually using raw sql query 
     // such as this 'Update Person Set Name = 'Process 2'where empid = @empid; 


     // When the update is performed , it is expected to throw the exception , as the in memory data 
     // is different from the one in database. 
     if (username.equals("Bob")) 
     { 
      Thread.Sleep(50000); 
      // If this is a website, have the above condition, so that it is simulated only for one user. 
     } 

     this.dalService.Update(person); 
    } 
0

Conceptuellement:

  1. utilisation 2 fils pour effectuer T1 et 2; et un verrou partagé pour synchroniser l'accès
  2. thread1 acquiert serrure et réalise T1
  3. thread2 acquiert le même verrou et effectue T2
  4. l'une des transactions échouent avec Optimiste Concurrency Exception
+0

Conceptuellement qui est très bien, pouvez-vous essayer de donner l'exemple pour la même en C# dans le contexte de NHibernate.? – vijaysylvester

Questions connexes