Oracle 选择更新锁与光标和批处理DML的交互

Oracle 选择更新锁与光标和批处理DML的交互,oracle,oracle-pro-c,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 fro

目前,我的代码框架如下所示:

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,无论更改的机会有多小

然而,作为承诺;释放锁,这一点非常重要,我确实要批量删除,因为有数百万条记录,在推进建议的解决方案方面似乎存在挑战

请告知是否有更好的替代方案。提前谢谢

关于我先前的问题:


请注意,整个过程都是在oracle-pro-c中进行的。

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

如果是这样的话,这可能对您有用-它将循环并删除行并提交,这样您就不会耗尽撤消功能,也不必担心锁定行

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

你能详细说明你的密码吗。当然,使用ROWID是访问表中某一行的最快方法,但它仍然是一种逐行处理,默认情况下速度较慢。目前,我看不出有任何理由使用循环或批量处理。尝试将所有条件放在一个DELETE语句中,这应该是最好的。@WernfriedDomscheit问题是,这种类型的清除不是一次性的过程,当一次删除多个记录时,它可能会一次创建大量撤消操作,这可能会使数据库瘫痪。因此,批处理会减少删除和提交的行数,从而减少系统负担。正如前面正确指出的,提交会释放行锁,因此不应将其与ROWID一起使用