Запуск нескольких сессий nhibernate в транзакции - PullRequest
3 голосов
/ 23 февраля 2012

Я работаю над приложением WPF, которое должно выполнять множество обновлений и вставок во время определенной операции. Мы используем Fluent Nhibernate 3.2. Я хочу выполнить все обновления и вставки в одной транзакции, чтобы в случае ошибки я мог откатить все шаги. Мы определили команды для каждого из шагов. Проблема заключается в том, что в одной из команд вставки мы использовали цикл Parallel.Foreach, в котором мы создаем новый сеанс без сохранения состояния для потока.

Теперь, если я хочу обернуть все эти команды в транзакцию, как мне это сделать.?

У нас уже реализован UnitOfWork, но он не допускает более одного сеанса одновременно. Поэтому я подумал о том, чтобы отойти от UnitOfWork и напрямую передать Sessionfactory каждой из команд. Каждая команда затем создает свой собственный сеанс и выполняет его. У нас есть командный процессор, который выполняет все команды:

public class CommandProcessor : ICommandProcessor
    {
        public void ExecuteCommands ( IEnumerable<ICommand> commands)
        {
            using (var scope = new TransactionScope(TransactionScopeOption.Required))
            {
                foreach (var command in commands)
                {
                        command.Execute(UnitOfWork.UnitOfWorkFactory.SessionFactory);
                }

                scope.Complete();
            }
        }
    }

Объем транзакции не работает, так как я получаю сообщение об ошибке «Операция недействительна для состояния транзакции».

Правильно ли используется область транзакции? Любые предложения о том, как я мог бы прогрессировать?

Спасибо.

1 Ответ

0 голосов
/ 28 июля 2013

Не делай этого. Если вы хотите решить проблему с производительностью, NHibernate предоставляет стратегии пакетирования для MSSqlServer, Oracle и Postgres, которые будут иметь дело с обновлениями / вставками в разумном количестве вызовов в пакетном режиме / дБ. Не разделяйте сеанс между несколькими потоками (вы этого не делаете) и предпочтительно не используйте DTS только для использования Parallel.ForEach.

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