可以这样;
在表中设一个加一字段,如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后记录会不会被后面的线程再次查询到
在表中设一个加一字段,如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后记录会不会被后面的线程再次查询到
UPDATE,
DELETE,
SELECT (FOR UPDATE)
以上操作在执行过程中,数据库都会对相应的行做数据行封锁.
select * from tb_name where cond;
那么你 改成这样的查询
select * from ( select rownum as id,field1,field2... from tb_name where cond) where mod(id,线程数) = n
这样你每个线程就可以使用不同的select,并且得到的记录不会重复
我觉得楼主的问题是由于设计上的原因造成的!
你可以加一个字段:col_status
如果为0代表这条记录未被处理过。
如果为1代表这条记录正在被处理。
如果为2代表这条记录被处理完毕。当处理程序挑选记录的时候只挑选col_status=0的记录,
如果获取,立刻设置其为col_status=1,如果处理完毕设col_status=2,
如果发生异常设回col_status=0。感觉你想用数据库的功能实现类似流程的功能。不知道对你是否有用!?
在表中设一个加一字段,如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后记录会不会被后面的线程再次查询到
-----------------------------------------
觉得这样会不错!
select ..... for update ; ---处理11
--处理完毕。
commit;
exception
when 处理1抛出的异常 then
----每2 ..N 时查询 抛出异常可以不处理
rollback;
when others then
null;
end;