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

标签 c# asp.net-mvc nhibernate concurrency

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

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

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

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

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

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

  • 隔离级别设置为 ReadCommitted。
  • session 工厂生命周期是 HybridLifeCycle(在 Web 上应该是 Session per request,但在 win 控制台应用程序上应该是 ThreadLocal)
  • 最佳答案

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

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

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

    关于c# - 如何防止 NHibernate 长时间运行的进程锁定网站?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15958407/

    相关文章:

    c# - 将密码/字符串发送到外部控制台应用程序 C#

    C# MVC。如何将新项目用作单独区域?

    nhibernate - 升级到最新的NHibernate和FNH-现在获得SQLite异常“回调例程请求中止…”

    c# - 业务逻辑层是否需要自己的模型

    ajax - MVC 部分 View 返回整个页面而不仅仅是部分页面

    c# - 如何使用 NHibernate Criteria API 进行多重连接

    nhibernate - 如何测试直接使用NHibernate的服务层?

    c# - 检查特定网站上的大代理列表的最快方法是什么?

    c# - 这可以用最小起订量来模拟吗?

    c# - 防止在 linq 查询中填充子表