在事务中运行多个nhibernate会话

时间:2012-02-23 11:59:35

标签: nhibernate session transactions

我正在开发一个WPF应用程序,它需要在特定操作期间执行大量更新和插入。我们正在使用Fluent Nhibernate 3.2。 我想在一个事务中执行所有更新和插入,这样如果有任何错误,我可以回滚所有步骤。 我们为每个步骤定义了命令。 问题是在其中一个insert命令中,我们使用了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 :(得分:0)

不要这样做。如果你想考虑性能问题,NHibernate为MSSqlServer,Oracle和Postgres提供批处理策略,它将处理合理数量的批次/ db调用中的更新/插入。不要在多个线程上共享会话(您不这样做),并且最好不要仅使用DTS来使用Parallel.ForEach。