Oracle 中enq: TM – contention等待事件故障处理

2025年2月19日 作者 XiaofeiHuangfu

【知识点解释】什么是Oracle的enq: TM – contention等待事件

TM Enqueue (DML Enqueue)是再执行DML操作修改表时由事务获取的。DML操作需要表锁,以防止与事务发生冲突的同时DDL操作。

当应用程序具有引用完整性并试图修改子/父表时,当外键上没有索引时,Oracle将在父/子表上获得额外的锁定。因此,建议为数据库中定义的所有外键添加索引。

TM锁上等待的最常见原因往往涉及外键约束,其中受约束的列没有被索引。Oracle还会等待TM锁,直到它被授予或请求超时或TM锁发生死锁检测。

问题描述:2022-09-16 17:42客户一重要系统数据库出现大量enq:tm-contention等待事件。

环境描述:AIX 6.1 + Oracle 11g RAC

问题原因:对t01_account表更新主键,导致引用该表主键作为外键的多个子表上发生了enq:tm-contention等待事件。

临时解决方案:与业务人员确认后kill update t02_account表的那条会话。

分析过程:

1、 查看等待事件,17:42开始出现了enq:tm-contention等待事件

16:30后核心数据库主要等待事件中enq:tm-contention最多

2、 AWR报告

节点1:

节点2:

该数据库2个节点top 10等待事件中enq:tm-contention均占第1位,节点1该等待时间占DB time的69.3%,节点2是79.9%。

3、 查询等待事件的p1,p2,p3参数

P1为mode为3,4,5

p2是数据库对象号242764,242895,242223,224171,241960,243602,242389,241986,242222,249589,242942,242368

SQL>select * from dba_objects o where O.OBJECT_ID= object_id;

3为0表示等待的为表或分区的锁。

4、 检查对象之间主外键关系 t02_account是多个表的父表。

SQL>SELECT * FROM ( SELECT c.table_name, cc.column_name, cc.position column_position FROM user_constraints c, user_cons_columns cc WHERE c.constraint_name = cc.constraint_name AND c.constraint_type = ‘R’ MINUS SELECT i.table_name, ic.column_name, ic.column_position FROM user_indexes i, user_ind_columns ic WHERE i.index_name = ic.index_name ) ORDER BY table_name, column_position;

-the end-