NHibernate: допустимо ли вызывать Session.Flush () перед фиксацией транзакции?

Мне нужно выполнить две операции внутри единицы работы NHibernate: транзакционную (сохранение объекта) и нетранзакционную.

нетранзакционную операцию нельзя откатить, если я сохраню объект до выполнения нетранзакционной операции (и, наконец, фиксации транзакции), я все равно получу транзакционное поведение:

  • Операции будут зафиксированы, только если две подоперации выполняются успешно;
  • Если сохранение объекта завершилось неудачно, нетранзакционная операция не будет выполнена;
  • Если нетранзакционная операция завершится неудачно, сохранение объекта будет отменено.

Проблема : с таким кодом, как показано ниже, NHibernate выиграл ' t выполнить фактическую вставку sql до вызова transaction.Commit () (который вызывает session.Flush () внутренне):

        using (var transaction = session.BeginTransaction())
        {
            session.Save(entity);
            NotTransactionalOperationBasedOn(entity);

            transaction.Commit(); // the actual sql insert will be executed here
        }

С таким кодом, если вставка Sql завершается неудачно, уже слишком поздно: NotTransactionalOperation была выполнена. Чтобы выполнить фактическую вставку SQL перед выполнением NotTransactionalOperation, я должен явно вызвать session.Flush () прямо перед session.Save ():

        using (var transaction = session.BeginTransaction())
        {
            session.Save(entity);
            session.Flush(); // the actual sql insert will be executed here

            NotTransactionalOperationBasedOn(entity);

            transaction.Commit(); 
        }

Код работает, но ... считается ли это лучшей практикой для вызова session.Flush () перед совершением транзакции? Если нет, есть ли лучшие способы достичь того же результата?

8
задан Notoriousxl 28 March 2011 в 21:13
поделиться