最近移动公司要在市里举行一个活动,就是每当用户使用短信回复一个字母到移动公司指定的一个号码(比如100862534001)我就给用户从数据库里读取一个数字发送给用户(数字从1到2011合计2011个数字),内容如下:“恭喜你你是第X个回复的用户,请到营业厅领取礼品”然后我把这个数字在数据库里标记为已经下发。测试后没有问题。
但是到了活动那一天很多的用户开始回复,数据量很大。
我却发现2011个数字却有回复重复的!!!!!
 
重复的数字竟然有50多个!
我真是晕死了。请问大家这是什么问题??
我使用的是华为的cmpp开发包做的
请大家帮我分析什么时候会出现这个问题  

解决方案 »

  1.   

    使用Optimistic Lock/Pessimistic Lock把随机挑选的数字记录hold住,应该可以解决LZ的问题。
      

  2.   

    LZ可以在系统启动的时候,从数据库取入一个数保存在一个静态变量中,给用户发送信息的同时,该静态变量自增,同时采用synchronized方式,保证多线程对该静态变量的同步,没必要每次去检索数据库更新数据库。
    或者如果是oracle数据库,采用sequence就可以了,当取到的数大于2011就视为无效
      

  3.   

    楼上说的是正确的..应该是线程并发的时候没有控制好的原因.
    比如:
    if 接收到用户信息{
      读取当前的已回复人员数量  //如果两个线程同时运行到这..那么..得到的结果会是一样的.
      反馈给用户当前为第几个回复的人..
    }主要看你们读取回复数量的时候是怎么读的,无论是static变量,还是SQL数据库读取..都记得synchronized控制下,当然也可以通过事务来控制..