SELECT FOR UPDATE锁与光标和批处理DML的交互

时间:2018-05-30 15:40:23

标签: oracle oracle-pro-c

目前我的代码框架如下:

varchar rowidvariable[batchlimitcount][19];

stmt = "Select rowid from table_name where xx"
delstmt = "delete from table_name where rowid=:rowidvariable"
prepare delstatement using delstmt;

prepare cursor from stmt;
declare cursor from preparecursor;
open cursor;

while(1)
{
    fetch cursor into rowidvariable;

    somecondition {break};        

    exec sql for fetchedCount 
        execute delstatement using :rowidvariable;

    commit;

} 

有人向我指出,使用SELECT FOR UPADATE锁定表将是确保100%行被锁定的方式,并且ROWID在任何情况下都是如此(无论机会多么小)不会改变。

然而,由于commit;释放了锁定,并且由于有数百万条记录而分批删除非常重要,因此推进解决方案似乎存在挑战。

请告知是否有更好的选择。提前谢谢。

前面提到我的问题:Link

请注意,整个过程发生在 oracle-pro-c

1 个答案:

答案 0 :(得分:-2)

听起来问题是您必须删除数百万行,因此您希望在baches中执行此操作

如果是这样,这可能对您有用 - 它将循环并删除行并提交,以便您不会用完撤消而且您不必担心锁定行

begin
   loop
      delete from xx where yyy=zzz and rownum < 1000;
      exit when sql%rowcount = 0;
      commit;
   end loop;
   commit;
end;
/