普通web程序放到IIS上运行
标题说得有点模糊,咱们也就不说什么临界资源了,举例说明,就谈论网上订票系统
A,B,C,D四个人,前三个都 买 北京->上海的票,而D是 退 北京->上海的票的,假如他们是同时刻访问网站的,而且他们没访问前,只有一张剩票,那么,A,B,C到底谁买不上票?
我猜想,估计是某个“机构”象操作系统进程调度那样,加他们到等待队列,对于数据库来讲,还是一个一个依次来。用PV操作那种做法来弄那么我的问题是:如果我的假设是对的,那么上面的“机构”是谁,谁来调度的。是IIS,数据库,还是程序本身?

解决方案 »

  1.   

    2楼其实说的也很对的啊,呵呵。假如:1.A的请求最先到IIS,IIS请求数据库,于是A买不到了。
    2.D的请求第二个到IIS,IIS开始写数据库,并等待数据库执行结果,以便反馈D有无退票成功;
    3.B的请求第三个到IIS(也可以是与D同时到IIS毕竟是多线程并发的),IIS请求数据库,悲催的是: (1).B明明在D之后或同时来到IIS,可是D的退票还没写入数据库,于是没买到。
     (2).D的票在B请求数据库就写入了数据库中退票信息表,可是采用事务更新剩票表还没完成,所以
     (3).D的退票明明写入数据库了,剩票表也更新了,可万恶的程序员采用了数据缓存技术(5分钟后刷新),B查到的剩票仍为0。4.C最后一个到了,也正好是D退票后的5分钟,于是他成功了。这个故事告诉我们,早起的虫儿被鸟吃。呵呵,只是随便侃侃,里面内容很不严谨。http://blog.csdn.net/cwbugs/article/details/7268267 
      

  2.   

    很简单啊,最先由网速,然后由IIS接管,达到并发上限进行队列处理,再转到数据库服务器接管啊。http://blog.csdn.net/cwbugs/article/details/7268267 
      

  3.   

    按你的意思,IIS和DBMS都参与调度了,是吧
      

  4.   

    客户端和IIS都仅仅是发出了申请,真正起到调度作用的是数据库服务器。第一个到达数据库服务器的锁定请求被执行,然后其它请求都被拒绝。直到第一个锁定请求完成,(票一般就被买走了)然后其它请求都被告知无票了。
      

  5.   

    应该这么说,谁的HTTP请求先到IIS谁就能买到票
      

  6.   

    在通常采用的开放式并发处理的条件下,在一次订票请求中,ABC谁都有可能订不到票,甚至是2个人订不到票。
      

  7.   

    IIS确实可以并发处理,但是本质上,如果是单核的服务器,这个并发其实也只是假象,本质是还是排序的另外,数据库的读操作可以多人一起来,但是写操作一定是加锁的,并且具有原子性。。所以,调度,先是IIS发出请求,然后数据库服务器的处理程序进行处理,这两步都很关键
      

  8.   

    大家说得没错,数据库写数据,必须是加锁的,这个是其内部机理我觉得IIS和数据库服务器都有调度,A,B,C,D访问网站,会创建4个实例,加入同时到达,也要排队吧;然后,每个实例都会去访问数据库,此时,数据库也得排队,一个一个来,有的客户必须要等待
    我是这么猜的,不知道是否正确。谈论这个,就是希望能开发出更高效的系统
      

  9.   

    没那么复杂,这个问题一般用数据库的事务机制实现,用IIS/web application实现也不是不可以,不过很少有人这么做,也很麻烦,
      

  10.   

    不一定要排队的,在数据库事务机制下,A,B,C,D对这张票的申请过程都是原子的,不可分割,这样其实A,B,C,D虽然看起来“同时”提出请求,但在瞬间有先后的区别,这样他们之间就自然排队,最先请求数据库锁的排在前面,最后请求的排在最后, 没必要显式实现“排队”机制,