oracle中'enq:TM争用'等待事件的原因

时间:2017-01-02 11:18:19

标签: oracle oracle11g database-performance

在v $ session中监视等待事件时,我观察到具有“等待”状态的会话数和事件是“enq:TM争用”。

以下查询从不同的会话运行,并且没有表具有任何外键约束。

INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabX t;   
INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabY t;   
INSERT /* APPEND */ INTO tabA SELECT /*+ PARALLEL(t,4) */<select list> FROM tabZ t; 
etc

此等待事件的原因是什么。

2 个答案:

答案 0 :(得分:1)

Here你会找到一个简短的解释和一些例子。

  

附加提示指示Oracle在独占中取出TM锁   模式6(“enq:TM - 争用”等待事件)。

答案 1 :(得分:1)

这是因为数据库中的几个会话需要很长时间才能处理一些插入语句。因此,“活动”会话计数非常高,数据库无法接受新的会话连接。

<强>解决方案:

enq:TM - 争用事件通常是由于缺少对Oracle DML操作一部分的表的外键约束。一旦通过将外键约束添加到相关表来解决问题,enq:TM - 争用事件就会消失。

等待执行插入操作的会话的enq:TM-contention事件的等待几乎总是由于未编入索引的外键约束。当依赖或子表引用父键的外键约束时,会发生这种情况。 table缺少关联键的索引。如果子表在父表中的主键列上执行了对子表的外键引用的修改,则Oracle会在子表上获取表锁。请注意,这些是全表锁(TM),而不是行级锁(TX),这些锁不限于一行,而是限制在整个表中。当然,一旦获得此表锁,Oracle将阻止所有其他试图修改子表数据的会话。在对引用父表的列执行的子表中创建索引后,由于TM争用而导致的等待将消失。

因为在您的情况下,表中没有外键约束,您可以检查以下几点:

1)检查是否有任何相关表有任何disabled个外键。如果找到,请启用它们。如果您在启用时遇到问题,请检查阻塞会话,如下所示并将其终止。

SQL> select a.sid, a.serial#
    from v$session a, v$locked_object b, dba_objects c 
    where b.object_id = c.object_id 
    and a.sid = b.session_id
    and OBJECT_NAME='EMP';

   SID    SERIAL#
   ----   --------
   753     8910

然后杀死这个阻止会话。

SQL> ALTER SYSTEM KILL SESSION '753,8910';

session killed.

希望在那之后您可以启用外键(如果有的话),然后解决争用问题。