Я работаю над приложением 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();
}
}
}
Объем транзакции не работает, так как я получаю сообщение об ошибке
«Операция недействительна для состояния транзакции».
Правильно ли используется область транзакции?
Любые предложения о том, как я мог бы прогрессировать?
Спасибо.