我有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)我需要在处理结束后立即提交(它是一个支付处理系统,以便立即向最终用户提供资金。
非常感谢您的帮助