表结构大致如下id username state  
1 a 0
2 b 0
3 c 0
4 d 0
5 e 0
6 f 0
7 h 0
8 l 0
9 g 0要求 每次查询两行内容(只查询state = 0 的内容),并同时把被查询的内容的 state 修改为 1 需要用到多线程查询,至少两个线程
现在有时候会出现线程1已经查询出来的数据,线程2也会查询出来,造成重复查询。请教有什么方法可以避免已经查询过的数据,不会再被查询出来?

解决方案 »

  1.   

    这涉及到线程同步的问题了。个人想法是:
    1,把查询库的代码写成一个函数。形参是数据库连接串和查询语句;
    2,使用lock关键字锁住这个函数。也就是当一个线程执行到这里的时候其他线程不能在访问,直到执行完毕。
      

  2.   


    2楼的确实是一个解决办法,不过体现不出多线程的效率来····鄙人的想法是这样:
    定义两个变量,一个tState存储线程操作状态(为1则是第一个线程刚操作完,为2则是第二个线程,以此类推;或者直接存储线程标识),一个rowNum存储读取到的行数(数据库里的ID)。
    每次在线程调用读取函数时先判断tState的值,若是本线程刚操作完则继续等待(这种情况几乎不会存在),若否则锁定tState、rowNum并将tState修改为本线程标识,将rowNum+2 然后释放它们。再然后就可以放心读取数据了
      

  3.   

    每次在线程调用读取函数时先判断tState的值,若是本线程刚操作完则继续等待(这种情况几乎不会存在),若否则锁定tState、rowNum并将tState修改为本线程标识,将rowNum+2 然后释放它们。再然后就可以放心读取数据了这个不太理解
    能否说清楚一点?
      

  4.   

    SELECT * FROM table WITH (HOLDLOCK) 加锁语句:
    sybase:
    update 表 set col1=col1 where 1=0 ;
    MSSQL:
    select col1 from 表 (tablockx) where 1=0 ;
    oracle:
    LOCK TABLE 表 IN EXCLUSIVE MODE ;
    加锁后其它人不可操作,直到加锁用户解锁,用commit或rollback解锁 多使用几个Thread对象来做,也可以,使用  
    BackgroudWorker组件