我正在开发一个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();
}
}
}
事务范围似乎不起作用,因为我收到错误 “该操作对交易状态无效”。
这是交易范围的正确用法吗? 关于我如何进步的任何建议?
感谢。
答案 0 :(得分:0)
不要这样做。如果你想考虑性能问题,NHibernate为MSSqlServer,Oracle和Postgres提供批处理策略,它将处理合理数量的批次/ db调用中的更新/插入。不要在多个线程上共享会话(您不这样做),并且最好不要仅使用DTS来使用Parallel.ForEach。