遇到一个多线程的问题,处理并发数据,在进行上报时有5个线程来上报数据,但是上报的数据不能上报2次,那么就用到了乐观锁String sql=" update table t set version=version+1 , t.转递标记='u' where version<"+oVersion+"+1 and t.id='"+id+"'";返回一个bool值如果true那么进行下面测操作,否则肯定是有其他线程正在处理这条数据那么不执行这条数据的操作此线程处理下一条,不过还是有重复上报记录,请问有哪几种可能

解决方案 »

  1.   

    问题补充:synchronized加锁,锁定多线程加在什么地方比较合适(块加锁),我锁定了一条update语句没效果,锁定了一个方法()就可以了晕死,还有select for update加锁在什么情况下用,他用了不就和单线程一样了吗?那为什么还用多线程搞不懂
      

  2.   

    不如在数据库加个是否处理完成的字段
    程序上用automaticboolean或类似的来控制
    省得用锁的麻烦
    jdk提供了为啥不用呢
      

  3.   

    synchronized是你java程序里面控制线程并发的,是应用层面的加锁,方法上加synchronized则同一时刻只能一个线程调用乐观锁是数据库层面的,启用乐观锁要谨慎,虽然可以提高并发效率,但是如果多个事务之间的操作交集很多,那会有很多的重复执行操作
      

  4.   

    你上报的记录就是id?会不会是id本身出现了重复的情况
      

  5.   

    synchronized加锁后,线程是停在那个方法等待其他线程处理完再处理加锁的方法还是,直接跳过执行下面语句