首页 > 代码库 > Session阻塞 读写锁引发的小问题
Session阻塞 读写锁引发的小问题
- 引子
我们来看两个ajax方法,先后的问题,会有什么样的结果?
Javascript:
$(function () { //第一个 $.ajax({ type: "POST", url: "/Home/Method1", success: function (msg) { $(‘#m1‘).html(‘第一个方法完成‘); } }); //第二个 $.ajax({ type: "POST", url: "/Home/Method2", success: function (msg) { $(‘#m2‘).html(‘第二个方法完成‘); } }); });
服务端
public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { Session["test"] = 123; return View(); } public ActionResult Method1() { Thread.Sleep(6000); return Json(""); } public ActionResult Method2() { return Json(""); } }
本以为:两个ajax是异步请求,谁先处理完,就谁先返回回来。
可是现实却大大出乎我的意料。见下图。
明显第二个请求是等第一个请求处理完了,才执行的。
- 根源
其实问题是出现在Session上,那么我们把Session["test"] 去掉,这样再看结果:
原来妖孽就是Session,同一会话,即请求的SessionId是相同的,都会初始化Session对象,并锁住Session对象;其他同一会话的请求要用到Session对象,只能等待。因此才会出现前面的情况。
- 解决
只需要标识当前会话session行为为只读行为,就不会加锁
[SessionState(SessionStateBehavior.ReadOnly)]
[SessionState(SessionStateBehavior.ReadOnly)] public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { Session["test"] = 123; return View(); } public ActionResult Method1() { Thread.Sleep(6000); return Json(""); } public ActionResult Method2() { return Json(""); } }
结果符合表述,如下图:
Session阻塞 读写锁引发的小问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。