首先我说 MS asp.net 锁定了“asp.net 处理页面”会话的核心,位于“webengine4.dll“asp.net 4 的 dll
我是从 MS 的角度说的asp.net act correct and lock the session this way
因为asp.net无法知道我们在会话中保留什么类型的信息,所以可以做出正确的“最后写入获胜”。
同样正确的是锁定为会议整页因为这种方式为您提供了非常重要的程序同步,根据现在的经验,我说您的大部分操作都需要它。在我用我的会话替换 ms 会话后,我的所有操作都需要进行全局锁定,否则我会遇到双重插入、双重操作等问题。
I give 一个例子我在这里认识到的问题。会话数据保存在 SessionSateItemCollection 中,它是一个键列表。当会话读取或写入此集合时,所有这些操作都会一起完成。那么我们来看看这个案例吧。
我们在会话中有树变量,“VAR1”,“VAR2”,“VAR3”
Page 1.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR1] = "数据1";
保存会议()
结果为 VAR1=data1,VAR2=(var2 的最后一个数据),VAR3=(var3 的最后一个数据)
Page 2.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR2] = "数据2";
保存会议()
结果为 VAR1=(var1 的最后一个数据), VAR2=data2, VAR3=(var3 的最后一个数据)
Page 3.
getsession(实际上获取所有数据并将它们放在列表中)
会话[VAR3] = "数据3";
保存会议()
结果为 VAR1=(var1 的最后一个数据), VAR2=(var2 的最后一个数据) VAR3="data3"
请注意,每个页面都有数据的克隆,因为他从会话介质中读取它们(例如,最后一次从数据库中读取数据)
如果我们让这 3 个页面在没有锁定的情况下运行,我们实际上并没有脏读,也没有“最后写入获胜” - 我们这里拥有的是“最后一个写入破坏了其他写入”,因为如果你再想一想,当 VAR1 改变时,为什么 VAR2 和 VAR3 保持不变?如果你在其他地方改变了 VAR2 怎么办?
出于这个原因,我们不能让它不加锁。
现在用 20 个变量来想象……完全混乱。
可能的解决方案
由于 asp.net 的多个池是多线程的,跨池和跨计算机保持相同数据的唯一方法是拥有一个公共数据库,或者像 asp.net State Service 这样的所有进程程序共用的数据库。
我选择拥有一个通用数据库,因为它比为此建议创建一个程序更容易。
现在如果我们连接a cookie我们制造的,至用户 至会话的数据用户,并且我们使用完全自定义的数据库字段来控制数据,我们知道我们想要锁定什么,不锁定什么,如何保存或更改,或者比较并保留最后写入获胜的数据,我们可以使这项工作正常进行,并完全禁用asp.net session 是一个通用的会话管理器,可以满足所有需求,但不能处理像这样的特殊情况。
asp.net 可以在未来的版本中实现此功能吗?是的,他可以通过创建一个名为脏的额外字段,并在会话上保存数据,使用脏字段或类似的东西来合并数据,但不能这样做现在按原样工作——至少从我到目前为止所发现的情况来看是这样。
实际上 SessionStateItem 在属性上有一个脏标志,但没有在保存数据结束时进行合并。如果有人想找到一种现有的 ms asp.net 会话状态管理器的解决方案,我真的很高兴,我正在写我到目前为止所发现的内容,但这并不意味着肯定没有办法 - 我还没有发现它就是这样。
希望一切有帮助:)
自定义会话状态模块
在这个答案中https://stackoverflow.com/a/3660837/159270 https://stackoverflow.com/a/3660837/159270James 在编写自定义模块后说道:我仍然不敢相信 ASP.Net Session 的自定义实现会锁定整个请求的会话。