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

The*_*One 1 c# nhibernate asp.net-mvc concurrency

我有一个使用ReadCommitted Isolation的NHibernate MVC应用程序.

在网站上,用户可以启动某个过程,并且根据输入,可能需要几分钟.这是因为会话是按请求进行的,并且整个时间都是开放的.

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

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

我不确定我的设置的哪一部分是错的,任何反馈都会受到赞赏.

NHibernate使用流畅的配置和StructureMap进行设置.

  • 隔离级别设置为ReadCommitted.
  • 会话工厂生命周期是HybridLifeCycle(在Web上应该是每个请求的Session,但在win控制台应用程序上将是ThreadLocal)

Kev*_*ker 5

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

  1. 将长时间运行的流程分解为一系列较小的事务.
  2. 大多数时候使用ReadUncommitted隔离级别(这在许​​多用例中都适用).
  3. 明智地使用Snapshot隔离级别(假设您使用的是MS-SQL 2005或更高版本).

(注意,我假设长时间运行的函数会执行大量的读/写操作,而被阻止的请求主要是执行读操作.)