Session阻塞 读写锁引发的小问题

时间:2021-04-24 06:59:46
  •   引子

    我们来看两个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"] = ;
return View();
} public ActionResult Method1()
{
Thread.Sleep();
return Json("");
} public ActionResult Method2()
{
return Json("");
} }

       本以为:两个ajax是异步请求,谁先处理完,就谁先返回回来。

可是现实却大大出乎我的意料。见下图。

Session阻塞  读写锁引发的小问题

明显第二个请求是等第一个请求处理完了,才执行的。

  • 根源

其实问题是出现在Session上,那么我们把Session["test"]  去掉,这样再看结果:

Session阻塞  读写锁引发的小问题

原来妖孽就是Session,同一会话,即请求的SessionId是相同的,都会初始化Session对象,并锁住Session对象;其他同一会话的请求要用到Session对象,只能等待。因此才会出现前面的情况。

  • 解决

只需要标识当前会话session行为为只读行为,就不会加锁

       [SessionState(SessionStateBehavior.ReadOnly)]
[SessionState(SessionStateBehavior.ReadOnly)]
public class HomeController : Controller
{
//
// GET: /Home/ public ActionResult Index()
{
Session["test"] = ;
return View();
} public ActionResult Method1()
{
Thread.Sleep();
return Json("");
} public ActionResult Method2()
{
return Json("");
}
}

结果符合表述,如下图:

Session阻塞  读写锁引发的小问题