Oracle - 使用提交选择更新 - 内部循环[PerformanceTuining]

时间:2015-07-25 14:39:20

标签: oracle

我有PLSQL代码,每天处理数百万笔交易。

DECLARE
    Cursor C1 is select * from myTable WHERE status='UNPROCESSED';
    Type table_type is table of c1%rowtype;
    l_record table_type;
    l_limit number := 5000;
    resource_busy EXCEPTION;
    PRAGMA EXCEPTION_INIT (resource_busy, -54);
BEGIN
    OPEN cursor c1;
    LOOP
       FETCH c1 BULK COLLECT INTO l_record LIMIT l_limit;
          IF l_record.count > 0 THEN
             FOR l_idx IN 1 .. l_record.COUNT LOOP
                 BEGIN
                   SELECT * FROM myTable
                     where primary_key = l_record(l_idx).primary_key
                   FOR UPDATE NOWAIT;

                   --do the processing 
                   COMMIT;
                EXCEPTION
                   WHEN resource_busy THEN
                        --SKIP TO NEXT RECORD.. RECORD IS BEING PROCESSED BY OTHER JOB    
                   WHEN OTHERS THEN
                         --LOG ERROR AND SKIP TO NEXT RECORD.. 
             END LOOP;
          END IF; 
       EXIT WHEN c1%NOTFOUND; 
    END LOOP;
END;

我有一个类似于上面的plsql匿名块的功能。每x分钟由作业调用该函数 Job1 - 选择所有记录并进行处理并将状态标记为PROCESSED Job2在x分钟后执行 - 它可以选择JOB1已经选择但尚未处理的记录。这就是为什么我有SELECT FOR UPDATE NO WAIT。

我的问题是,有什么方法可以使这段代码更好,其中
1)我可以避免处理由另一个作业处理的记录 2)我需要在处理结束后立即提交(它是一个支付处理系统,以便立即向最终用户提供资金。

非常感谢您的帮助

0 个答案:

没有答案