oracle job问多线程问题

pdw2009 2009-08-24 05:14:31
奖况:
我现在有一个表A,系统前台不断的添加记录。现在要做一个job处理表A的记录。我使用的是
cursor is select * from (
select A.* from sms_timing_send A where A.SEND_TIME>=sysdate and STATUS=1 ) where rownum<40 for update NOWAIT;

open cur_tsend;
for idx in cur_tsend loop

end loop;
close cur_tsend;
commit;
exception
when others then

用存储过程来处理表A的记录,存储过程尚未测试,编译没问题,到底逻辑对不对呢?
我的要求是:
1、可能多job同时运行
2、每次根据时间优先每次处理40条记录,要求不出现死锁情况,请大家给我提解决方案,

谢谢了!

...全文
264 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
pdw2009 2009-10-28
  • 打赏
  • 举报
回复
谢谢大家
hailang1118 2009-08-25
  • 打赏
  • 举报
回复
你的问题不能用纯Oracle解决的。用[for update skip locked]倒是可以,但是必须的跟业务交互。

看看这么做行不行。
1。在你的表里加一个Lock字段,一个JOB专门做更新这个字段,比如你有5个JOB要做查询操作,1-5,你就循环
给这5个JOB分配数据。
2。这5个JOB查询出,给自己分配的数据。
chutao 2009-08-25
  • 打赏
  • 举报
回复
不要在这里处理,在前段中间层的应用程序处理最好
majy 2009-08-24
  • 打赏
  • 举报
回复
你加了nowait,不同的事务之间是互斥的(nowait就是如果有人加了锁就不等了直接返回),只要有一个job在运行,另外的job都会自动失败的,所以不会有死锁


不明白你的处理需求为什么会是这样的。如果一条数据处理过了还需要再处理吗?为什么需要多个job同时运行?

再问一句:where A.SEND_TIME>=sysdate 这样能选出数据吗?你的所有的记录的时间应该都小于当前的系统时间吧

Richard345265669 2009-08-24
  • 打赏
  • 举报
回复
支持一下
vc555 2009-08-24
  • 打赏
  • 举报
回复
多job同时运行,是不是各自处理40条记录?这个条件where rownum <40 ?
并发的话用for update skip locked
pdw2009 2009-08-24
  • 打赏
  • 举报
回复
兄弟,对我提的要求有什么好方法解决吗?
vc555 2009-08-24
  • 打赏
  • 举报
回复
同时运行会有等待的

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧