我应该把问题说明白些,myTable中有一个字段为Oracle的全局序列;程序中不断有数据insert 进来;又有多线程循环处理表中的数据,线程数〈10;第一个线程都循环从myTable中一次取100条数据,然后把这处理过的100数据delete。同样,第二线程也从myTable中去100条数据,处理完并删除,其他线程也是这样处理....现在的问题是:第一线程从myTable中取100条数据后,在delete 之前,其他线程会从myTable中取出数据。这些数据有可能是已经被第一线程取出。

解决方案 »

  1.   

    用select ... from ... for update语句,这样可以将这100条记录锁定,其他人就取不出来了。
      

  2.   

    呵呵楼上方法不行,for update锁定是指不能让其他人对取出的记录进行delete ,update等操作,不能保证给其他线程select出来。
    找到一个方法,供大家参考:
    线程0读取序列号最后一个数字为0的记录,如:0,10,20,30....;线程1读取序列号最后一个数字为0的记录,如:1,11,21,31....;直到线程9读取序列号最后一个数字为9的记录,如:9,19,29,39....的记录。这样各个线程就不会互相影响。如果线程数是10,则采用:读的记录为〔(记录号)%(线程数)〕。