当我将数据导入大型表时,我遇到了问题,整个网站都会关闭,直到导入完成。插入/更新过程最多可能需要3个小时才能完成。此外,如果由于某种原因抛出异常,表将无限期地保持锁定状态,直到重新启动应用程序池。
我调查了发生的事情。显然,触摸的表将被锁定,直到此过程完成。如果这是直接的SQL查询,我会在查询中添加“with(NOLOCK)”来解决问题。但是,我无法弄清楚如何告诉Fluent NHibernate将其添加到它生成的查询中。
另外,有没有办法构建会话工厂,我可以将其设置为默认情况下将“with(NOLOCK)”打开到所有查询中?
提前致谢。
答案 0 :(得分:7)
当您打开会话或无状态会话时,使用IsolationLevel.ReadUncomitted开始事务。这相当于在该事务中的所有语句上指定NOLOCK。
using (var session = _sessionFactory.OpenSession())
using (var transaction = session.BeginTransaction(IsolationLevel.ReadUncommitted))
{
// do work
transaction.Commit();
}