События OnPost запускаются перед фиксацией - PullRequest
0 голосов
/ 08 мая 2018

Скажем, у меня есть некоторый стандартный код NHibernate, подобный этому, который записывает в базу данных SQL:

using (var session = SessionFactory.OpenSession())
{
  using (var tx = session.BeginTransaction())
  {
      var customer = session.Get<Customer>(id);
      customer.Property1 = "new value";
      customer.Property2 = "new value";
      tx.Commit();
  }
}

Я пытаюсь создать таблицу копирования для Клиента (в базе данных NoSQL). Поэтому при выполнении кода выше запускается следующий обработчик событий:

public void OnPostUpdate(PostUpdateEvent postUpdateEvent)
        {
            if (postDeleteEvent.Entity.GetType() == typeof(Customer)) 
            {
                var customer = (Customer)postUpdateEvent.Entity;
                customerCopyRepository.Update(customer);
            }
        }

Если бы я изменил первый фрагмент кода на вставку, то это запустилось бы:

 public void OnPostInsert(PostInsertEvent postInsertEvent)
        {
            if (postInsertEvent.Entity.GetType() == typeof(Customer))  
            {
                var customer = (Customer)postInsertEvent.Entity;
                customerCopyRepository.Insert(customer);
            }
        }

и когда происходит удаление, запускается:

public void OnPostDelete(PostDeleteEvent postDeleteEvent)
        {
            if (postDeleteEvent.Entity.GetType() == typeof(Customer)) 
            {
                var customer = (Customer)postDeleteEvent.Entity;
                customerCopyRepository.Delete(customer.Id);
            }
        }

CustomerCopyRepository внедряется в конструктор класса.

Это работает очень хорошо. Единственная проблема, с которой я столкнулся, заключается в том, что каждое из указанных выше событий, по-видимому, запускается до того, как данные передаются в базу данных. Поэтому может произойти следующий сценарий:

1) Запись клиента в базу данных NoSQL.

2) Клиент не записан в базу данных SQL (из-за ошибки SQL).

Можно ли как-нибудь предотвратить этот сценарий?

1 Ответ

0 голосов
/ 12 мая 2018

У меня точно такой же сценарий (синхронизация с ElasticSearch), и в итоге я использовал метод RegisterSynchronization:

private void Sync(IPostDatabaseOperationEventArgs e)
{
    e.Session.Transaction.RegisterSynchronization(new AfterTransactionCompletes(success =>
    {
        if (!success)
            return;

        // Do your stuff
    }));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...