Skip to main content
 首页 » 编程设计

c#之如何防止 NHibernate 长时间运行的进程锁定网站

2024年01月18日25lovecherry

我有一个使用 ReadCommitted 隔离的 NHibernate MVC 应用程序。

在站点上,用户可以启动某个过程,根据输入,可能需要几分钟。这是因为 session 是按请求进行的,并且一直处于打开状态。

但是在运行时,没有其他用户可以访问该站点(他们可以尝试,但除非长期运行的事情完成,否则他们的请求不会通过)

更重要的是,我还需要一个控制台应用程序,它在连接到同一个数据库时也能执行这个长时间运行的功能。它导致了同样的问题。

我不确定我的设置的哪一部分是错误的,任何反馈将不胜感激。

NHibernate 设置了流畅的配置和 StructureMap。

  • 隔离级别设置为 ReadCommitted。
  • session 工厂生命周期是 HybridLifeCycle(在 Web 上应该是 Session per request,但在 win 控制台应用程序上应该是 ThreadLocal)
  • 请您参考如下方法:

    听起来您的请求正在等待数据库锁。你的选择真的是:

  • 将长期运行的流程分解为一系列较小的事务。
  • 大多数时候使用 ReadUncommitted 隔离级别(这适用于很多用例)。
  • 明智地使用快照隔离级别(假设您使用的是 MS-SQL 2005 或更高版本)。

  • (注意,我假设长时间运行的函数会进行大量读取/写入,而被阻止的请求主要是读取。)