我用 NHibernate 作为 ORM 构建了一个小型 ASP.NET MVC Web 应用程序。在每个 HTTP 请求开始时,我都会创建一个会话并打开一个事务并在请求结束时关闭它。
// Begin request
session = StaticSessionManager.OpenSession();
session.BeginTransaction();
// End of request
currentSession.Transaction.Commit();
currentSession.Flush();
currentSession.Close();
现在我还在使用DotNetOpenAuth API 进行 Facebook/Google 登录。为了让我注册一个新用户,API 要求我用一些用户信息更新一个表(比如 UserProfile)。这是我通过 Nhibernate 的 Save() 做的
session.Save(new UserProfile { UserName = userName });
在同一个 Web 请求中,DotNetOpenAuth API 期望从该表(UserProfile)中读取上述插入的数据。
现在这会导致死锁场景,因为 NHibernate 的 Save 对数据库应用了某种锁定。即使我手动尝试使用 SQL Server Management Studio 从该表中读取数据,它似乎也要等到 Web 请求超时。
现在我在保存后尝试了显式刷新
session.Flush();
但即使这样也不能摆脱锁。我希望我的 DotNetOpenAUth API 能够读取最新数据。
目前,我在保存后进行交易,然后再重新打开一次。我不确定这是否是最佳做法/有任何缺点。