首页 > 代码库 > 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阻塞 读写锁引发的小问题