• 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("");
            }
        }

     

     

     结果符合表述,如下图:

  • 相关阅读:
    使用AWS、Docker与Rancher提供弹性的生产级服务
    如何用微服务重构应用程序
    Prometheus入门
    Docker监控:最佳实践以及cAdvisor和Prometheus监控工具的对比
    前后端分离session不一致问题
    Eclipse整合SSM框架+AOP+全局异常处理
    SSM配置基于注解AOP
    有关Linux
    Tomcat下配置javaWeb访问路径-Linux
    Linux下如何安装Nginx
  • 原文地址:https://www.cnblogs.com/cainiaoguoshi/p/3976100.html
Copyright © 2020-2023  润新知