Oracle ORA-04020:尝试锁定对象时检测到死锁

Oracle ORA-04020:尝试锁定对象时检测到死锁,oracle,plsql,Oracle,Plsql,在尝试锁定对象时检测到一个ORA-04020:死锁,我相信错误的来源可能是以下语句: v_sql := 'DELETE FROM ' || in_table_name || ' SUBPARTITION (' || v_subpart_name || ')'; EXECUTE IMMEDIATE v_sql; v_sql := 'ALTER TABLE ' || in_table_name || ' TRUNCATE SUBPARTITION ' || v_subpart_name

在尝试锁定对象时检测到一个
ORA-04020:死锁,我相信错误的来源可能是以下语句:

  v_sql := 'DELETE FROM ' || in_table_name || ' SUBPARTITION (' || v_subpart_name || ')';
  EXECUTE IMMEDIATE v_sql;

  v_sql := 'ALTER TABLE ' || in_table_name || ' TRUNCATE SUBPARTITION ' || v_subpart_name;
  EXECUTE IMMEDIATE v_sql;

关于如何解决这个问题有什么想法吗?是否是
ALTER
语句抛出错误,因为
DELETE
就在它前面?不确定,我以为
ALTER
只会在
DELETE
完成后执行一次。或者可能是程序在退出并重新执行之前没有等待
ALTER
完成

如果您已经在执行截断子分区,那么为什么需要删除。TRUNCATE是从表中删除数据的非常有效的方法

另一方面,您必须在删除之后进行提交,然后只允许截断

问候
Ramki

这可能是因为没有提交,所以delete会锁定行。您可能会发现下面的链接对我在dev/production env中遇到的这个问题很有帮助。在我的例子中,我正在删除带有“更新索引”的“子分区”。即使没有其他会话执行任何DML,我也能得到它。对我来说,这似乎是一个“自我僵局”。一旦我破解它就会发布细节。。。