目前正在做一个HIS系统,有一个功能是挂号,挂号里面有专家号,专家号是限制了一天可以挂几个号。
比如一个专家号我限制一天只能挂5个号,在挂的时候做了下校验,限号数-count(当天已挂的号)
问题来了。这样判断很容易发生并发,好几个挂号员在操作的时候可能会同时通过校验,就会多出来很多号,该如何做限制?

解决方案 »

  1.   

    你可以对这个count 使用lock住了,这样只能有一个线程操作这个变量的,你也可以直接是哟Task对象来完成你的需求,Task类的使用更多可以参考这个文章:
    http://www.cnblogs.com/pengstone/archive/2012/12/23/2830238.html
      

  2.   

    确实是跟业务有关,可以考虑乐观并发控制,也可以结合数据库事务,譬如update expert_count 
    set count = count - 1
    where expert_id = 123 and count > 0在程序里,检查返回的更新记录数目(records affected),如果=0,表明更新没成功,就作回滚,然后你就可以说没号了
      

  3.   

    1.在数据库产生挂号单时,用流水号记录单号标识“YYYYMMDD000(1~5)”;
    如果当天的流水号超过5,则提满额。2.在生成挂号单的读写前,通过Lock(Object)的方式,锁定读写的逻辑模块。
      

  4.   

    能不能用队列呢?
    几个人同时挂号的时候,先把它加入到队列中去··Queue...
      

  5.   

    可以用存储过程加事务来实现
    例如
    create proc Usp_What
    as
    begin
            开始事务
            检测是否可以挂号
                如果可以则挂号
                如果不可以返回失败
            检测已经挂号人数
                如果不对则回滚事务
                如果对则提交
    end