nhibernate - 在事务中运行多个 nhibernate session

标签 nhibernate session transactions

我正在开发一个 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/

相关文章:

c# - NHibernate- 防止删除特定实体(即设为只读)

php $userid 错误,无法从 mysql 检索数据

session - 如何处理 TensorFlow session 以同时训练多个 Keras 模型?

php - Codeigniter - 获取所有用户 session 数据

php - 请问laravel数据库事务锁表吗?

c# - NHibernate QueryOver NullReferenceException

mysql - 如何关闭 NHibernate 连接?

c# - 此 Linq 查询的哪一部分对 nHibernate 无效?

azure - Azure SQL DB 事务日志位于哪里?

grails - 如何在 Grails 中指定默认事务隔离级别