可以这样;
在表中设一个加一字段,如locked.
定义光标 is select rowid from tablename where locked=0 and rownum<=1 and other;
select collist from tablename where rowid=光标.rowid;
update tablename set locked=1 wehre rowid=光标.rowid;
commit ;
要执行的操作;
commit;
解锁:update table set locked=0;commit ;
光键是你怎样去想办法区分locked=0后记录会不会被后面的线程再次查询到

解决方案 »

  1.   

    INSERT,
     UPDATE,
     DELETE,
     SELECT (FOR UPDATE)
     
    以上操作在执行过程中,数据库都会对相应的行做数据行封锁.
      

  2.   

    这样,如果你的select语句是 
    select * from tb_name where cond; 
    那么你 改成这样的查询 
    select * from ( select rownum as id,field1,field2... from tb_name where cond) where mod(id,线程数) = n
    这样你每个线程就可以使用不同的select,并且得到的记录不会重复
      

  3.   

    qiaozhiwei(乔):能详细解释一下,你的思想和方法吗?
      

  4.   

    我猜,qiaozhiwei(乔)是通过为每天记录加上编号,按不同的编号范围去查找不同的记录!
    我觉得楼主的问题是由于设计上的原因造成的!
    你可以加一个字段:col_status
    如果为0代表这条记录未被处理过。
    如果为1代表这条记录正在被处理。
    如果为2代表这条记录被处理完毕。当处理程序挑选记录的时候只挑选col_status=0的记录,
    如果获取,立刻设置其为col_status=1,如果处理完毕设col_status=2,
    如果发生异常设回col_status=0。感觉你想用数据库的功能实现类似流程的功能。不知道对你是否有用!?
      

  5.   

    可以这样;
    在表中设一个加一字段,如locked.
    定义光标 is select rowid from tablename where locked=0 and rownum<=1 and other;
    select collist from tablename where rowid=光标.rowid;
    update tablename set locked=1 wehre rowid=光标.rowid;
    commit ;
    要执行的操作;
    commit;
    解锁:update table set locked=0;commit ;
    光键是你怎样去想办法区分locked=0后记录会不会被后面的线程再次查询到
    -----------------------------------------
    觉得这样会不错!
      

  6.   

    加锁吧。 最完美是最简单。 楼主将业务逻辑放到其他地方现实吧。declare begin 
       select  ..... for update ;   ---处理11 
       --处理完毕。
       commit;
    exception 
       when 处理1抛出的异常  then 
          ----每2 ..N 时查询 抛出异常可以不处理
          rollback;
       when others then 
          null;
    end;