oracle enq: tm,Tuning enq: TM – contention with foreign key (外键引起的队列)

article/2025/8/28 12:00:23

TM – Enqueue contention 与Table Manipulation相关的入队争用,可以在使用需要锁定表的重组活动显式锁定表时看到。

ID1 ID2的含义

ID1  :  0(LGWR)  or object_number, 即DBA_OBJECTS.OBJECT_ID

ID2:   0 for a normal table / partition lock ; 1 for a partition-wait lock.

常见原因:

A. Due to Missing Foreign Key (FK) index on the FK constraint columns in the Childtables

通常会发生此事件的等待,因为包含外键约束的列上缺少索引。 在这种情况下,Oracle在DELETE,INSERT和UPDATE语句期间被迫在子表上获取TM锁。

B. Enq: TM – contention’ Wait Event (TM Enqueue Contention) Using Parallel DML :

TM locks are Table-level locks that protect the table from being modified mid transaction.

A parallel DML operation’s lock requirement is very different from serial DML. The available locks are controlled by the parameter ‘DML_Locks’.

If you are seeing heavy TM lock contention on objects while using Parallel DML, you should ensure that the number of DML locks specified is realistic for the concurrent workload.

C. Enq: TM – contention’ Wait Event Occurs During ANALYZE INDEX VALIDATE STRUCTURE :

TM (Table Manipulation) enqueue is acquired during : ANALYZE INDEX VALIDATE STRUCTURE If an index is being analyzed using the ANALYZE INDEX VALIDATE STRUCTURE command while a DML operation on the underlying table is being attempted (requiring a TM lock to be placed), then contention on “enq: TM – contention” can occur.

The ANALYZE INDEX command acquires a TM enqueue in share mode on the underlying table; this will block other sessions when they attempt to place a TM lock that is incompatible with a share-mode lock.

SQL>select s.command from v$lock l, v$session s where l.sid = s.sid and l.block = 1 and l.type=’TM’;

演示第一种情况

290019f902e0fc55b2551a0a83c7e88e.png出门滑雪前,不要忘了给你的外键列加上索引!!有时为了数据的完整性不得不加外键,当然是其它从应用程序中控制完整性,如果有外键而忽略了索引,很可能你的数据库会看到上面的负载图,看下面的两个实验

sys@ANBOB> conn anbob/anbob

Connected.

anbob@ANBOB> create table team(id int,name varchar2(20));

Table created.

anbob@ANBOB> insert into team values(1,'HR');

1 row created.

anbob@ANBOB> insert into team values(2,'IBG');

1 row created.

anbob@ANBOB> insert into team values(3,'OSC');

1 row created.

anbob@ANBOB> commit;

Commit complete.

anbob@ANBOB> create table memb(id int,name varchar2(20),tid int,

2 constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade);

constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade)

*

ERROR at line 2:

ORA-02270: no matching unique or primary key for this column-list

anbob@ANBOB> alter table team modify id primary key;

Table altered.

anbob@ANBOB> create table memb(id int,name varchar2(20),tid int,

2 constraint fk_mem_team_id foreign key (tid) references team(id) on delete cascade);

Table created.

anbob@ANBOB> select table_name,index_name from user_indexes where TABLE_name='TEAM';

TABLE_NAME INDEX_NAME

------------------------------ ------------------------------

TEAM SYS_C005168

anbob@ANBOB> insert into memb values(1,'anbob',3);

1 row created.

anbob@ANBOB> insert into memb values(2,'adm',1);

1 row created.

anbob@ANBOB> insert into memb values(3,'sal',2);

1 row created.

anbob@ANBOB> commit;

Commit complete.

anbob@ANBOB> delete team where id=1;

1 row deleted.

anbob@ANBOB> select userenv('sessionid') from dual;

USERENV('SESSIONID')

--------------------

2317

anbob@ANBOB>

########新开一个session 2

[oracle@aix ~]$ sqlplus anbob/anbob

SQL*Plus: Release 10.2.0.1.0 - Production on ????????? 6??? 16 17:21:30 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

anbob@ANBOB> delete team where id=2;

挂 起

再新开一个session 3

[oracle@aix ~]$ sqlplus anbob/anbob

SQL*Plus: Release 10.2.0.1.0 - Production on ????????? 6??? 16 17:22:13 2011

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

anbob@ANBOB> insert into memb values(10,'jack',3);

挂起

##########新开一个session 4 ,查看一下lock

sys@ANBOB> col event for a30

sys@ANBOB> /

SID USERNAME BLOCKER EVENT TY LMODE REQUEST OBJECT_NAM OBJECT_TYPE

---------- ---------- ---------- ------------------------------ -- ---------- ---------- ---------- -------------------

141 ANBOB 131 enq: TM - contention TM 3 0 TEAM TABLE

133 ANBOB 141 enq: TM - contention TM 2 0 TEAM TABLE

131 ANBOB SQL*Net message from client TX 6 0

131 ANBOB SQL*Net message from client TM 3 0 MEMB TABLE

141 ANBOB 131 enq: TM - contention TM 0 5 MEMB TABLE

133 ANBOB 141 enq: TM - contention TM 0 3 MEMB TABLE

131 ANBOB SQL*Net message from client TM 3 0 TEAM TABLE

...

166 rdbms ipc message CF 2 0

161 smon timer TS 3 0 I_OBJ# INDEX

168 rdbms ipc message MR 4 0 I_OBJ# INDEX

18 rows selected.

anbob@ANBOB> create index idx_mem_tid on memb(tid);

Index created.

解决方法在子表父字段建索引后,就不再影响其它的insert了

实验2

session1

anbob@ANBOB> insert into team values(4,'HR');

1 row created.

session 2

SQL> insert into memb values(13,'rain',5);

insert into memb values(13,'rain',5)

*

ERROR at line 1:

ORA-02291: integrity constraint (ANBOB.FK_MEM_TEAM_ID) violated - parent key not found

SQL> insert into memb values(13,'rain',4); 又hang 住了

session 3查一下当前的等待

sys@ANBOB> select sid,serial#,event,audsid from v$session where username='ANBOB';

SID SERIAL# EVENT AUDSID

---------- ---------- ------------------------------ ----------

143 3675 enq: TX - row lock contention 2584

154 875 SQL*Net message from client 2597

回到session 1 ctrl+c 取消操作,查看一下当前的audsid ,确认sid143等待是它

SQL> insert into memb values(13,'rain',4);

insert into memb values(13,'rain',4)

*

ERROR at line 1:

ORA-02291: integrity constraint (ANBOB.FK_MEM_TEAM_ID) violated - parent key

not found

SQL> select userenv('sessionid') from dual;

USERENV('SESSIONID')

--------------------

2584

The following script will show all unindexed columns from foreign key constraints for a specific user and it can also be customized to include only the one table :

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'

AND c.owner = upper('&&owner') and cc.owner = upper('&&owner')

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

AND c.owner = upper('&&owner') and cc.owner = upper('&&owner')

)

ORDER BY table_name, column_position;

打赏

8732971891f4ba05583674ca6b8145ac.png微信扫一扫,打赏作者吧~


http://chatgpt.dhexx.cn/article/BjaDnwTn.shtml

相关文章

Oracle-enq: TX - row lock contention 等待事件分析

什么是enq:TX - row lock contention等待: 等待事件enq:TX - row lock contention 是Oracle常见的几大等待事件之一,在开启的事务中,为了维护事务数据的一致性,会在事务所涉及的修改行中添加TX锁以防止其他会话同时修改数据,当其他会话等待该…

Oracle死锁问题: enq: TX - row lock contention

前言 这篇文章也是记录近期遇到的问题以及从中学到的知识 ,近期一直在救火,有些问题自认为还是挺有代表性的,有兴趣的话再继续向下看 问题现象 线上反馈,执行批量处理EXCEL数据时,系统一直卡在进度滚动条界面。处理任务…

oracle dump enq hw,enq:HW–contention 故障处理

enq: HW - contention 说明: 硬件队列用于序列化段的高水位线以外的空间分配。 可以用手动分配范围即可解决问题。 V$SESSION_WAIT,P2 / V$LOCK.ID1 is the tablespace number. V$SESSION_WAIT.P3 / V$LOCK.ID2 is the relative data block address (dba) of segmen…

oracle enq ta,Oracle 的 enq: TT - contention 等待事件

Oracle 的 enq: TT - contention 等待事件 在遇到 TT 锁等待时,你可能会被Oracle的文档所困扰。即便是在Oracle Database 12c的文档中,关于TT锁的描述也是:Temporary table enqueue。 这其实已经不准确了,从数据库中可以得到更详细和准确的描述,V$LOCK_TYPE中有着准确记录…

oracle enq ta,enq: TA – contention 等待事件

enq: TA – contention 等待事件 This enqueue is used when undo tablespace operations are being performed. Some examples of such operations are: When dropping an undo tablespace we acquire the enqueue in exclsuive mode to stop other sessions using the undo t…

关于AQS中的enq方法的理解

自己太笨了,总感觉有点绕,就整理下吧~ private Node enq(final Node node) {//自旋锁for (;;) {//tail默认就是nullNode t tail;if (t null) { // Must initialize//因为tail默认是null,所以首次一定会进来//compareAndSetHead在下面//也就…

队列等待之enq: TX - row lock contention

【性能优化】队列等待之enq: TX - row lock contention 问题背景&#xff1a; 客户反映某条sql DELETE SHAREINNERDOC WHERE SOURCEID:B1<br/>这个执行时间太长 问题解决 1> 查看awr报告&#xff1a; 有队列等待之enq: TX - row lock contention&#xff0c;对应的sq…

等待事件 enq:TX - row lock contention分析与解决

6月30日&#xff0c;数据库发生了大量锁表。大概持续1小时&#xff0c;并且越锁越多。后来通过业务人员停掉程序&#xff0c;并kill掉会话后解决。 几天后再EM上查看CPU占用&#xff1a; CPU发生了明显等待。 主要是由于enq:TX - row lock contention等待事件造成。 等待事…

java -- 随机获取字母或者数字

java只有涉及到随机的&#xff0c;最经常用到的方法就是Math.random()&#xff0c;这个方法会返回一个大于0小于1的随机数( 能取0不能取1 )&#xff0c;如果我们要随机0-9&#xff0c;就可以用&#xff08;Math.random()*10&#xff09;来表示&#xff0c;随机0-99也类似如此操…

JavaScript生成随机字母数字字符串

如何使用javascript生成随机字母数字字符串&#xff1f;下面本篇文章就来给大家介绍一下使用JavaScript生成随机字母数字字符串的方法&#xff0c;希望对大家有所帮助。 方法一&#xff1a;Math.random()方法和Math.floor()方法 ● 创建一个函数&#xff0c;该函数有两个参数…

Python - 怎么将一个数字拆分成多个随机数字

前情提要 使用numpy.random.choice()的时候&#xff0c;通过参数p&#xff08;一个列表&#xff09;来指定所给选择元素的选择概率。但参数p&#xff08;选择概率&#xff09;要保证和为1&#xff0c;这时我又想随机生成选择概率&#xff0c;所以现在的问题就是怎么将1拆分成多…

python随机生成一个数字_如何实现python随机生成数字?

今天小编就生成随机数,整理了多个方式,方便大家在项目时,根据自己的需求,直接拿来套用即可,以下内容相当详细,具体来看看吧~ 说明:python中生成随机数主要用到random模块,方法主要包括:randint、uniform、random、sample、choice等几种常用方法; 环境:Mac OS 10.1…

python随机生成三位数字_python3 随机生成数字

原博文 2019-11-25 10:07 − random模块 random.randint(1,10)--随机生成0-10之间的随机整数 random.uniform(1,10)--随机生成0-10之间的实数 random.randrange(9,100,10)--从9-100之间随机选取一个实数,差为10,也就是说从9,19,29,39,49... 0 3530 相关推荐 2019-12-0…

C#生成含数字字母的随机字符串

C#生成含数字字母的随机字符串 要求生成的字符串是随机的&#xff0c;也就是字母和数字都需要随机&#xff0c;既可能只包含数字&#xff0c;也可能只包含字母&#xff0c;也可能两者都有。 实现方式如下: 首先定义一个包含所有字母和数字的字符串和一个空串&#xff0c;随后…

css 随机 数,纯CSS实现随机效果

最近在Codepen上看到了Adir写的随机翻牌和找蛋蛋(可以想象是砸金蛋)效果&#xff0c;让我再次刷新了对CSS的认知。看到这两个效果之后我才知道&#xff0c;在CSS中除了可以实现 来自其他语言的随机性 众所周知&#xff0c;CSS是一种声明式的标记语言。在很多同学的认知中&#…

舒尔特表-5*5表格1-25个数字随机生成且不重复

大家好&#xff1a;最近在玩快速记忆&#xff0c;看到舒尔特表&#xff0c;整理出一版来。v1.0版本。 舒尔特表&#xff1a;5*5表格 1-25个数字&#xff0c;随机生成且不重复。 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http:/…

计算机随机数字excel,excel怎么生成随机数字 excel随机数字区间怎么设定

excel是我们日常生活中处理表格数据必备的工具&#xff0c;当我们知道了一定范围内的数值&#xff0c;并且不用精准的数值时&#xff0c;我们完全可以设置excel随机生成数字即可&#xff0c;怎么设置?很简单&#xff0c;下面小编为大家带来excel生成随机数字的详细教程&#x…

随机生成4个数字php,PHP随机生成4位数字的方法

//方法1 $code .mt_rand(1000,9999).; echo $code; echo ; //方法2 $code .mt_rand(1000,9999).; echo $code; echo ; //方法3 $code ; $code..mt_rand(0,9).; $code..mt_rand(0,9).; $code..mt_rand(0,9).; $code..mt_rand(0,9).; echo $code; echo ; //方法4 $code ; $r…

java生成1到10的随机数_用java生成一个1到10十个数字随机排列的数组

效果如图&#xff1a; 代码如下public class ArrayListToAry { public static void main(String[] args) { // 数组 int[] ary new int[10]; // 集合 ,临时集合temp存放1~10个数字 ArrayList temp new ArrayList(); //list集合存放需要的数字 ArrayList list new ArrayList(…

你知道如何生成随机数吗?(超详细附图)

目录 &#x1f609;前言 &#x1f378;如何用C语言实现随机数 &#x1f379;随机数原理 &#x1f379;rand函数&#xff08;生成随机数&#xff09; &#x1f379;srand&#xff08;避免每次运行程序产生的随机数都相同&#xff09; &#x1f379;时间戳 &#x1f964;t…