Concorrenza Violazione in NHibernate (c #) esempio
-
24-09-2019 - |
Domanda
Per un bel po 'di tempo, stavo leggendo la concorrenza ottimistica in NHibernate. Se quello che ho capito è stato corretto allora il seguito del campione dovrebbe tenere bene.
Si considerino due transazioni T1 e T2.
- Quando T1 e T2 sono fatte contemporaneamente, lo stato (voci DB) viene aggiornato con i valori del ultimo aggiornamento più. (T1 o T2).
Anche se sembra essere concettualmente corretto, come faccio a simulare questo con lo scopo di comprendere e di test di integrazione.?
Può qualcuno aiutarlo con un codice di esempio C #.?
Grazie,
Vijay
Soluzione 2
Ora, dopo un sacco di googling, ho trovato un modo abbastanza semplice per farlo .Il seguito sono riportati i passaggi per riprodurre questo.
-
Avere un Thread.Sleep () tra il Get () e Update () metodi, per un solo utente (processo 1).
-
Quando il processo è in esecuzione 1, 2, processo che pretende incontro il Thread.Sleep () e completa l'aggiornamento prima del processo 1 avviare fa.
-
Ora elaborare 2 ha modificato i dati nella base di dati, ora quando processo 1 tenta di aggiornare i dati, NHibernate genera un'eccezione oggetto stantio.
Si prega di fare riferimento il seguente frammento di codice.
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);
}
Altri suggerimenti
Concettualmente:
- uso 2 fili per l'esecuzione T1 e 2; ed un blocco condiviso per l'accesso sincronizzare
- Thread1 acquisisce bloccano e si esibisce T1
- Thread2 acquisisce la stessa serratura e si esibisce T2
- una delle transazioni non verrà effettuata con Optimistic Concurrency Eccezione