我正在使用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();
}
}
}
出现错误时,交易范围似乎不起作用
“该操作对于交易状态无效”。
这是交易范围的正确用法吗?
关于我如何进步的任何建议?
谢谢。
最佳答案
不要这样如果您想考虑性能问题,NHibernate提供了MSSqlServer,Oracle和Postgres的批处理策略,它们将以合理数量的批处理/数据库调用处理更新/插入。不要在多个线程上共享会话(您不要这样做),最好不要仅使用DTS来使用Parallel.ForEach。