日期:2014-05-17  浏览次数:20741 次

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

------解决方案--------------------
首先要知道,遇到这种问题不可学究化。这不是数据库“锁、事务”的技术问题,这时业务问题。

比如说一个业务员操作时比较慢,用了5分钟,难道其他操作员就要死机5分钟?比如说这个操作员尿急,忽然上厕所了呢?

所以这种东西不是技术问题。只知道技术的思路,总是容易出问题。你随便观察一下实际的手工操作向有经验的操作人员学习,就会发现不同的但是实际的方法。例如人家会把号先给各个操作员,然后操作员才开始挂号操作。如果操作中断、或者超时,系统就自动把号再放回原来的地方,供其它操作员处理去了。
------解决方案--------------------
确实是跟业务有关,可以考虑乐观并发控制,也可以结合数据库事务,譬如

update expert_count 
set count = count - 1
where expert_id = 123 and count > 0

在程序里,检查返回的更新记录数目(records affected),如果=0,表明更新没成功,就作回滚,然后你就可以说没号了