方法1,
首先,确保“queue”表是用InnoDB形式存储的,以支持事务
然后,在“queue”表增加一个标志位,读取的时候设定位一个中间状态
然后,等待短消息发送完毕后,在把这条记录删除掉
最后,一条数据处理完毕后提交事务

解决方案 »

  1.   

    我设置了一个标志位state,但是我采用的是批量处理,一次处理50-100条,所以到事务提交前,标志位没有改变。这个过程中,别的线程可能对其重复操作,存在并发问题。
      

  2.   

    各线程可以都通过单例设计模式使用hibernate的同一个session对数据操作,这样就不会出现数据不同步的问题了
      

  3.   

    加一个标志字段,线程取到带发送消息首先update这个字段(比如标示这条短信被线程占用),如果update结果反回为0说明,线程未取到,如此反复,直到取道,然后线程发送消息,如果发送成功,则delete然后log,否则置回原始状态
    等待分配给其他线程
      

  4.   

    采用多级缓存机制queue发送总表
    每个线程一个临时发送表,每个线程分别读取和删除自己临时子表中的数据
    tmp_queue_0001...tmp_queue_0010设计一个单线程,循环检测每个线程的临时表,检测到数据记录数为0时,
    从queue表中取得100条记录,插入到子表,并同时从queue中删除记录
    (这个过程中使用事务操作)这个方式应该完全满足你的应用