【问题标题】:Session Lock Contention with Page Readonly in Inproc ModeInproc 模式下与页面只读的会话锁定争用
【发布时间】:2009-08-21 19:17:31
【问题描述】:

我最近发现,当您将页面设置为只读会话并且您使用 inproc(内存中)会话存储时,会话在该页面上仍然是可写的,而不是真正的只读。进程外会话存储确实尊重只读设置。

当页面设置为只读并使用 inproc 模式时,您是否仍能受益于没有会话锁定争用?在 readonly 和 inproc 时,具有相同 session Id 的多个同时请求是否必须等待 session 锁释放?

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    查看这篇博文:Handling multiple simultaneous requests from a user in ASP.NET:

    • enableSessionState="true" 是默认行为,并获取会话数据的写入器锁定。持有此锁时,其他读者或作者无法获得访问权限。

    • enableSessionState="ReadOnly" 获取会话数据的读取器锁定。同时允许多个读取器,但如果任何读取器持有锁,则没有写入器可以访问。不幸的是,您对会话所做的任何更改对于请求都是本地的,并且对于查看会话对象的其他请求不可见。如果您尝试修改“只读”会话,则不会引发错误,因此这种行为乍一看并不明显。

    • enableSessionState="false" 不获取任何锁。 HttpContext.Session 属性最终为空,您的页面将无法访问会话数据。

    【讨论】:

      【解决方案2】:

      BuzzAnn,

      Microsoft 的有关该主题的文档表明,将您的页面级会话状态模式设置为“只读”应该可以防止您同时尝试写入会话状态信息(它们将排队并按顺序处理) ,但将允许多个阅读器。请参阅“同步访问会话状态”部分:

      http://msdn.microsoft.com/en-us/library/aa479041.aspx

      当页面的 EnableSessionState 属性设置为“ReadOnly”时,每个页面请求都会尝试获取对状态信息的读取器锁定。在标准的 ReaderWriterLock 语义中,任意数量的读者可以同时访问受保护的信息。但是,任何实现写入器锁定的请求(例如,通过将 EnableSessionState 设置为“true”)都会阻止写入会话状态信息,直到请求保持写入器锁定完成。

      只要您尝试在页面的 EnableSessionState 设置为“ReadOnly”的情况下读取会话状态信息,所有读取请求都将继续进行而不会阻塞。但是,如果您尝试编写,文档并不清楚实际会发生什么。假设只使用 ReaderWriterLock 来同步访问,我的猜测是您不会受到覆盖、竞争条件和其他非同步访问问题的保护。

      如果您要尝试写入会话状态,请务必将 EnableSessionState 设置为“true”,以确保实现写入器锁定并根据需要进行同步。

      我希望这会有所帮助!

      【讨论】:

      • 目前还不清楚只对 inproc 会发生什么。它是否仍然对 inproc 使用 reader\writer 锁定,因为它不遵循 inproc 的 readonly 设置。我发现的唯一信息来自syncfusion.com/faq/aspnet/web_c9c.aspx,其中指出:“即使那些 enableSessionState 被标记为 ReadOnly,但在 InProc 状态下,用户仍然可以修改会话。唯一的区别是会话不会被锁定请求。此限制是设计使然"
      • 您从 SyncFusion 引用的文本块与我基于 ReaderWriterLock 语义所期望的一致。将 EnableSessionState 模式设置为“ReadOnly”不会使其对 InProc 只读;相反,您是在(向 ASP.NET)表明您打算以只读方式使用它。 “ReadOnly”模式比“true”模式限制更少,并且只保证您不会与 EnableSessionState 为“true”的页面所做的其他更改发生冲突。试图从“只读”模式下的页面修改会话状态仍然是一个危险的提议。这有帮助吗?
      • 是的,这有帮助。所以你说的是即使使用 InProc 仍然会发生锁定。无论是读取器锁的只读还是写入器锁的“真”。我同意尝试在 inproc 模式下将所有页面设为只读,同时仍在这些页面上写入会话是危险的。但是,一位同事建议将其作为一个选项,我正在尝试确定这样做是否可以解决锁定争用问题,而无需更改所有代码以不写入会话。我们有一小部分请求在等待一个从未完成的请求时被阻塞了 2 分钟。Thx
      • 实际上,对于 readonly 和 inproc,会话并没有被锁定。我们编写了一个测试程序来验证这一点。
      • 当您说会话“未锁定”时,您究竟是什么意思(也就是说,您的测试假设是什么)?您是在测试会话的读/写行为,还是在谈论文档指示使用的 InProc ReaderWriterLock?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多