我正在开发一个 WPF 应用程序,它需要在特定操作期间执行大量更新和插入操作。我们正在使用 Fluent Nhibernate 3.2。 我想在单个事务中执行所有更新和插入,这样如果出现任何错误我可以回滚所有步骤。 我们已经为每个步骤定义了命令。 问题在于,在其中一个插入命令中,我们使用了 Parallel.Foreach 循环,在该循环中我们为每个线程创建了一个新的无状态 session 。
现在如果我想将所有这些命令包装在一个事务中,我该怎么做。?
我们已经实现了一个 UnitOfWork ,但一次不允许多个 session 。所以我想到离开 UnitOfWork 并直接将 Sessionfactory 传递给每个命令。然后每个命令都会创建自己的 session 并执行它。 我们有一个执行所有命令的命令处理器:
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 提供了批处理策略,这些策略将在合理数量的批处理/数据库调用中处理更新/插入。不要在多个线程上共享 session (你不会这样做)并且最好不要只使用 DTS 来使用 Parallel.ForEach。
关于nhibernate - 在事务中运行多个 nhibernate session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9412649/