【问题标题】:Can a insert operation make another DDL operation wait?插入操作可以让另一个 DDL 操作等待吗?
【发布时间】:2021-08-16 12:17:28
【问题描述】:

我正在尝试了解出现以下错误的原因。

`ORA-04021: timeout occurred while waiting to lock object`

运行命令alter table <<T_NAME>> truncate subpartition <<SUBPARTITION_NAME>>.时从过程中抛出此错误

    v_dyncursor_stmt := 'with obj as (select /*+ materialize */ data_object_id, subobject_name from   user_objects where  object_name = UPPER(''' ||
                    p_table_name ||
                    ''') and object_type = ''TABLE SUBPARTITION'') select '||p_hint||' distinct subobject_name from ' ||
                    p_table_name || ' t, obj where data_object_id = DBMS_MView.PMarker(t.rowid) and ' || p_where;

/* log */
log_text(v_unit_name, 'INFO', 'Open cursor', v_dyncursor_stmt);

/* loop over partitions which needs to be truncated */
v_counter := 0;
open c_subpartitions for v_dyncursor_stmt;
loop
  FETCH c_subpartitions
    INTO v_subpartition_name;
  EXIT WHEN c_subpartitions%NOTFOUND;

  v_statement := 'alter table ' || p_table_name || ' truncate subpartition "' || v_subpartition_name || '"';

  execStmt(v_statement);

代码两次调用上述过程,第一次尝试成功。它可以很好地截断子分区。在第二次尝试中它失败了......下面给出了execStmt函数,错误是从EXCEUTE IMMEDITE线抛出的......

procedure execStmt(p_statement IN VARCHAR2) IS
  v_unit_name varchar2(1024) := 'execStmt';
v_simulate  varchar2(256);
begin
v_simulate := utilities.get_parameter('PART_PURGE_SIMULATE', '0');
if (v_simulate = '1') then
  log_text(v_unit_name, 'INFO', 'Statement skipped. (PART_PURGE_SIMULATE=1)', 
p_statement);
else
  /* log */
  log_text(v_unit_name, 'INFO', 'Executing statement', p_statement);

  EXECUTE IMMEDIATE p_statement;
end if;

end;

由于这主要发生在周末,我没有机会检查锁定表以查看锁定对象的原因。但我确定这是一张有很多插入发生的表。 所以我的问题是表上的插入操作可以防止上述 DDL 吗??

从 oracle 文档中,我看到插入需要一个 SX 锁,解释如下,

A row exclusive lock (RX), also called a subexclusive table lock (SX), indicates that the transaction holding the lock has updated table rows or issued SELECT ... FOR UPDATE. An SX lock allows other transactions to query, insert, update, delete, or lock rows concurrently in the same table. Therefore, SX locks allow multiple transactions to obtain simultaneous SX and SS locks for the same table.

【问题讨论】:

  • 您应该能够truncate partition 不是正在运行的insert 的目标。尝试使用未提交的 DML 截断分区,您将得到ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired,因此您对ORA-04021 的问题似乎有其他原因。是否可能需要重新编译一些正在使用的无效包等?
  • @MarmiteBomber:我怎样才能找出无效的包裹?如果它有帮助......这个问题不会一直发生......它是间歇性的。 ORA-04021 不也与 ORA-00054 的性质相同..
  • 检查注释 1054939.6 或 169139.1(MOS 用户需要),您必须首先了解导致 ORA-04021 的对象它不必是包,也可以是表或其他类型。编译一个用过的包后的这个异常只是最流行的
  • @MarmiteBomber ...谢谢,我看到更改表格的过程是通过动态光标完成的...我已经更新了问题中的代码...请检查一下并建议光标创建是否有机会....?
  • @MarmiteBomber ...我已经添加了部分代码。有打开游标的日志...但是过程失败...。动态游标的创建或准备语句的执行可以使pkg再次编译吗?没有人手动尝试更新同一个包。请你检查一个。我不是 DBA,因此访问权限或知识有限,无法进一步检查。

标签: oracle oracle11g ddl dml database-locking


【解决方案1】:

发生此错误是因为您尝试截断的分区当时正在使用中。正如您所提到的,这些插入语句当时正在运行,它会影响 DDL 操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-05
    • 2012-11-25
    • 2021-11-28
    • 2012-01-26
    • 2015-11-09
    • 2014-06-27
    • 2015-02-02
    • 2020-02-20
    相关资源
    最近更新 更多