可以这样;
在表中设一个加一字段,如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后记录会不会被后面的线程再次查询到
解决方案 »
- 关于oracle导入导出
- 关于sqldeveloper 连接oracle出现ora12505的奇怪问题
- oracle用utl_file的方法生成个文件,如果通过代码得到文件大小
- (200分求)如何有条件的定时更新数据—在线等,只能发100,解决立马重开贴兑现
- 关于oracle的一个最简单问题
- 请问在pro*c中该怎样定义变量类型才能正确传递一个较长的数据(10-20)给存储过程?
- 关于substr函数
- 请问怎么在oracle中定义自增型字段?
- 有关ORACLE导入与导出功能实现的讨论
- odbc 连接Oracle 报错State:S0022
- 用动态SQL插入记录是不是会把尾部的空格去掉,怎么解决?
- 过程中动态建表的问题!!
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;