如何在Fluent NHibernate中关闭锁定?

5
当我导入数据到一个大表时,整个网站会崩溃直到导入完成。插入/更新过程可能需要长达3小时的时间才能完成。此外,如果出现异常,表格将无限期地保持锁定状态,直到应用程序池重新启动。
我研究了发生的事情。显然,在此过程完成之前,所涉及的表都被锁定。如果这是直接的SQL查询,我会在查询中添加"with (NOLOCK)"来解决问题。但是,我不知道如何告诉Fluent NHibernate将其添加到生成的查询中。
另外,在构建Session Factory时,是否有一种方法可以设置默认开启"with (NOLOCK)"以适用于所有查询?
提前致谢。

你需要设置锁定模式。 - rie819
你正在使用无状态会话吗?这可能会有帮助。http://davybrion.com/blog/2008/10/bulk-data-operations-with-nhibernates-stateless-sessions/ - CrazyCoderz
这是我使用SQL拦截器的解决方案。 https://dev59.com/q3M_5IYBdhLWcg3wn0hO#39518098 - Tola Ch.
1个回答

8

当您打开会话或无状态会话时,请使用IsolationLevel.ReadUncomitted开始一个事务。这相当于在该事务中的所有语句上指定NOLOCK。

using (var session = _sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction(IsolationLevel.ReadUncommitted))
{
    // do work

    transaction.Commit();
}

1
Matt,感谢您提供的解决方案。我将其标记为解决方案,因为它同样有效。我发现的解决方案是在我的NHibernate查询中添加“SetLockMode(LockMode.None)”。 - Michael D. Kirkpatrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接