NHIbernate会影响非nhibernate查询吗?

时间:2010-10-15 10:24:22

标签: c# .net nhibernate transactions

我对NHIbernate有一个奇怪的问题,并且看到这是我的第一个NHIbernate项目,我以为我会问StackOverflow.com的好人。

我正在遵循ASP.Net中的“在视图中打开会话”模式,该模式在每个请求上打开一个hibernate事务并在请求结束时提交它。

这通常很好用,但是在我的一个页面上,这只是一个阅读页面而不是写入页面,我遇到了问题。有问题的页面会获得一个项目列表,并根据它们对信息进行一些查询。

作为其中的一部分,它调用一个外部DLL,它有一个SQL查询到其内部的数据库。此调用似乎适用于所有项目,除了一个,它在ExecuteReader()调用上获得超时。

在尝试查找外部DLl中的错误一段时间后,我决定在http处理程序内注释掉事务的建立。这解决了这个问题。

因此,以某种方式休眠会话管理正在影响外部的,无关的(好吧,有些映射可能会触及该查询中使用的相同数据库,但是它只能在两端读取)

我的问题是,为什么要这样做?什么是nhibernate在引擎盖下导致其他SQL查询超时?我认为它对数据库的某些部分有锁定,但是如果页面只读取,为什么会这样做呢?我怎么能绕过这个?

编辑: 本指南的以下部分 http://www.codeproject.com/KB/architecture/NHibernateBestPractices.aspx

更多信息: 我有一个IHttpModule,它在BeginRequest

中执行以下操作
private void BeginTransaction(object sender, EventArgs e)
    {
        Console.WriteLine("Begin Transaction");
      NHibernateSessionManager.Instance.BeginTransaction();
    }

然后关闭

  private void CommitAndCloseSession(object sender, EventArgs e)
    {
    Console.WriteLine("End Transaction");
    try
    {

        NHibernateSessionManager.Instance.CommitTransaction();
    }
    finally
    {
        NHibernateSessionManager.Instance.CloseSession();
    }
}

NHIbernateSEssionManager执行此操作: - 在HTTPContext中存储ITransaction + ISession。这些可以作为名为ContextTransaction和ContextSession的属性访问。这些用于:

   public void BeginTransaction()
        {
            ITransaction transaction = ContextTransaction;

            if (transaction == null)
            {
                transaction = GetSession().BeginTransaction();
                ContextTransaction = transaction;
            }
        }

     public void CommitTransaction()
        {
            ITransaction transaction = ContextTransaction;

            try
            {
                if (HasOpenTransaction())
                {
                    transaction.Commit();
                    ContextTransaction = null;
                }
            }
            catch (HibernateException)
            {
                RollbackTransaction();
                throw;
            }
        }

1 个答案:

答案 0 :(得分:0)

从它的声音我猜测有一个环境分布式交易导致交叉影响。您是否使用TransactionScope类来管理交易?