查看原文
其他

深入剖析:update pk会发生什么?

2016-09-30 张大朋 Oracle


张大朋(Lunar)Oracle 资深技术专家

Lunar 拥有超过十年的 ORACLE SUPPORT 从业经验,曾经服务于ORACLE ACS部门,现就职于 ORACLE Sales Consultant 部门,负责的产品主要是 Exadata,Golden Gate,Database 等。


编辑手记:前面我们分享了insert 的enq: TM – contention对有主外键关系的表的操作。今天拣选此文继续认识只有主键约束无子表的时候,该等待事件的内部机制。


前文回顾:insert 的enq: TM – contention


结论:

对存在pk的表来说,无论有没有子表,update pk的操作会同时阻塞对该表做insert操作中那些pk跟update语句更改前、后两个值相关的会话。


测试六

测试一下子表无事务的情况下,对父表的update是如何影响父表的delete和insert的
首先,我们在Session 4(SID 116)对做commit,此时session 2(SID 220)会自动解锁,并报出来应有的违反约束的错误ORA-02292:


Session 4:



现在,我们把所有的会话都做commit或者rollback,然后观察对父表的updae会不会对父表的其他DML操作有影响:

Session 2(SID 220):



Session 4(SID 116):



Session 5(SID 222):



Session 3观察:



这里看见session 4对父表的delete不受session 2在父表的update的影响,而session 5对父表的insert 会被session 2在父表的update阻塞,被阻塞的对父表的insert操作等待事件为:enq: TX – row lock contention


在测试一次:把上面所有会话都commit或者rollback,然后:


Session 2(SID 220):



Session 4(SID 116):


这里我们看到,对父表的update阻塞了对其他会话对父表insert时pk的值=updae父表的pk的值的会话。
这个我们可以再做一个测试:


测试7,新建两个表,一个有pk,一个无pk,然后做同样的update和insert操作:

无pk的表:



这测试不会有任何问题。


现在我们改为带有pk的表:



SESSION 1:


SESSION 2:



也就是说,对存在pk的表来说,无论有没有子表,update pk的操作会同时阻塞对该表做insert操作中那些pk跟update语句更改前、后两个值相关的会话
比如update LUNAR2 set deptno =3 WHERE DEPTNO=2,就会阻塞所有insert deptno=2和deptno=3的会话


至此,你是不是对enq: TM – contention的等待事件了解更深了呢


如果您还觉得看文档学习不过瘾,国庆之后,11月4、5两天,Oracle技术嘉年华 - 国内规模最大的Oracle技术盛会将要举行,美国OOW的最新信息将悉数来至中国,欢迎您来到大会现场。


Oracle技术嘉年华相关信息请点击了解:2016 Oracle技术嘉年华



当然为了保证假期数据库运行无忧,我们建议你可以试一下“白求恩数据库健康体检”,专家水准,免费提供,网址 bethune.enmotech.com ,原文链接直达。



如何加入"云和恩墨大讲堂"微信群

搜索 盖国强(Eygle)微信号:eyygle,或者扫描下面二维码,备注:云和恩墨大讲堂,即可入群。每周与千人共享免费技术分享,与讲师在线讨论。


近期文章

SQL 执行周期性一慢两快

insert into 太慢的问题

监控索引的使用情况

RAC的全局死锁问题

资源下载

关注本微信(OraNews)回复关键字获取

2016DTCC, 2016数据库大会PPT;

DBALife,"DBA的一天"精品海报大图;

12cArch,“Oracle 12c体系结构”精品海报;

DBA01,《Oracle DBA手记》第一本下载;

YunHe“云和恩墨大讲堂”案例文档下载;


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存