日期:2014-05-20  浏览次数:20639 次

1-1000个数字随机下发数字给用户却出现重复的问题,真是奇怪
最近移动公司要在市里举行一个活动,就是每当用户使用短信回复一个字母到移动公司指定的一个号码(比如100862534001)我就给用户从数据库里读取一个数字发送给用户(数字从1到2011合计2011个数字),内容如下:“恭喜你你是第X个回复的用户,请到营业厅领取礼品”然后我把这个数字在数据库里标记为已经下发。

测试后没有问题。
但是到了活动那一天很多的用户开始回复,数据量很大。
我却发现2011个数字却有回复重复的!!!!!
 
重复的数字竟然有50多个!
我真是晕死了。请问大家这是什么问题??
我使用的是华为的cmpp开发包做的
请大家帮我分析什么时候会出现这个问题

  


------解决方案--------------------
应该是线程问题。。。并发控制!
------解决方案--------------------
方法 同步 没进行控制 .即楼上回答的
------解决方案--------------------
对读取的数据没有进行同步控制,读取前给数据加把锁,修改完数据后再将锁释放掉,这样多个线程并行时,先检测锁,再判断是否能对数据进行读写。
------解决方案--------------------
使用Optimistic Lock/Pessimistic Lock把随机挑选的数字记录hold住,应该可以解决LZ的问题。
------解决方案--------------------
LZ可以在系统启动的时候,从数据库取入一个数保存在一个静态变量中,给用户发送信息的同时,该静态变量自增,同时采用synchronized方式,保证多线程对该静态变量的同步,没必要每次去检索数据库更新数据库。
或者如果是oracle数据库,采用sequence就可以了,当取到的数大于2011就视为无效

------解决方案--------------------
楼上说的是正确的..应该是线程并发的时候没有控制好的原因.
比如:
if 接收到用户信息{
读取当前的已回复人员数量 //如果两个线程同时运行到这..那么..得到的结果会是一样的.
反馈给用户当前为第几个回复的人..
}

主要看你们读取回复数量的时候是怎么读的,无论是static变量,还是SQL数据库读取..都记得synchronized控制下,当然也可以通过事务来控制..
------解决方案--------------------
多线程并发搞的鬼,研究一下线程安全