Нарушение параллелизма в примере NHibernate (c #) - PullRequest
0 голосов
/ 04 марта 2010

В течение некоторого времени я читал о оптимистическом параллелизме в NHibernate. Если то, что я понял, было правильным, то приведенный ниже образец должен остаться в силе.

Рассмотрим две транзакции T1 и T2.

  1. Когда T1 и T2 выполняются одновременно, состояние (записи БД) обновляется значениями самого последнего обновления. (T1 или T2).

Хотя это кажется концептуально обоснованным, как мне смоделировать это для понимания и тестирования интеграции ??1013*

Может ли кто-нибудь помочь мне с примером кода C # .?

Спасибо,

Виджей

Ответы [ 2 ]

0 голосов
/ 21 марта 2010

Теперь, после долгих поисков, я нашел довольно простой способ сделать это. Ниже приведены шаги, чтобы воспроизвести это.

  1. Наличие метода Thread.Sleep () между методами Get () и Update () только для одного пользователя (процесс 1).

  2. Когда процесс 1 запущен, запустите процесс 2, который не сталкивается с Thread.Sleep (), и завершите обновление до того, как процесс 1 сделает.

  3. Теперь процесс 2 изменил данные в базе данных, теперь, когда процесс 1 пытается обновить данные, NHibernate генерирует исключение устаревшего объекта.

Пожалуйста, используйте следующий фрагмент кода.

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 голосов
/ 05 марта 2010

Концептуально:

  1. использовать 2 потока для выполнения T1 и 2; и общая блокировка для синхронизации доступа
  2. поток1 получает блокировку и выполняет T1
  3. thread2 получает такую ​​же блокировку и выполняет T2
  4. одна из транзакций не будет выполнена с исключением оптимистического параллелизма
...