【问题标题】:NHibernate: Multiple Transactions on a single sessionNHibernate:单个会话上的多个事务
【发布时间】:2013-10-28 18:14:34
【问题描述】:

我想通过在单个会话中创建多个事务来了解是否有任何问题,如下所示:

using (var session = factory.OpenSession())
{
    using (var trans1 = session.BeginTransaction())
    {
        .....
        trans1.commit();
    }

    using (var trans2 = session.BeginTransaction())
    {
        .....
        trans2.commit();
    }

    using (var trans3 = session.BeginTransaction())
    {
        .....
        trans3.commit();
    }

    using (var trans = session.BeginTransaction())
    {
        .....
        // trans1.commit();
    }
}

这可能吗?或者我必须为每个事务打开一个新的会话对象吗?

感谢您的帮助。

【问题讨论】:

    标签: c# .net database nhibernate rdbms


    【解决方案1】:

    是的,你正在做的很好。

    nhibernate 不支持的是多个嵌套事务。

    【讨论】:

      【解决方案2】:

      即使在 NHibernate 中,在单个会话中处理多个事务也不常见。同样从个人经验来看,我可以说在任何其他情况下重用会话都不是一个好主意。

      我建议让工作流程尽可能简单以避免任何副作用:

      • 打开会话
      • 开启交易
      • 使用您的实体
      • 提交交易
      • 出现异常时回滚
      • 关闭/刷新会话(始终)

      【讨论】:

        【解决方案3】:

        网络环境中最常见的策略是每个请求都有会话。
        当涉及事务时,它实际上取决于您的用例。
        您正在做的事情很好,否则 nhibernate 不会将会话与事务分开。
        但同样,这取决于您的业务案例情况。

        我建议你用IDisposable 包裹session.BeginTransaction(),所以Dispose 你一定要提交事务。

        【讨论】:

          【解决方案4】:

          虽然不寻常,但没有问题。请记住,如果任何事务回滚,则应丢弃会话。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-06
            • 2012-03-30
            • 2012-08-19
            • 1970-01-01
            • 2012-11-11
            • 1970-01-01
            相关资源
            最近更新 更多