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.

  1. 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

È stato utile?

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.

  1. Avere un Thread.Sleep () tra il Get () e Update () metodi, per un solo utente (processo 1).

  2. Quando il processo è in esecuzione 1, 2, processo che pretende incontro il Thread.Sleep () e completa l'aggiornamento prima del processo 1 avviare fa.

  3. 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:

  1. uso 2 fili per l'esecuzione T1 e 2; ed un blocco condiviso per l'accesso sincronizzare
  2. Thread1 acquisisce bloccano e si esibisce T1
  3. Thread2 acquisisce la stessa serratura e si esibisce T2
  4. una delle transazioni non verrà effettuata con Optimistic Concurrency Eccezione
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top