奖况:
我现在有一个表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条记录,要求不出现死锁情况,请大家给我提解决方案,谢谢了!

解决方案 »

  1.   

    多job同时运行,是不是各自处理40条记录?这个条件where rownum <40 ?
    并发的话用for update skip locked
      

  2.   

    你加了nowait,不同的事务之间是互斥的(nowait就是如果有人加了锁就不等了直接返回),只要有一个job在运行,另外的job都会自动失败的,所以不会有死锁
    不明白你的处理需求为什么会是这样的。如果一条数据处理过了还需要再处理吗?为什么需要多个job同时运行?再问一句:where A.SEND_TIME>=sysdate 这样能选出数据吗?你的所有的记录的时间应该都小于当前的系统时间吧
      

  3.   

    你的问题不能用纯Oracle解决的。用[for update skip locked]倒是可以,但是必须的跟业务交互。看看这么做行不行。
    1。在你的表里加一个Lock字段,一个JOB专门做更新这个字段,比如你有5个JOB要做查询操作,1-5,你就循环
    给这5个JOB分配数据。
    2。这5个JOB查询出,给自己分配的数据。