首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >深入剖析:update pk会发生什么?

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

作者头像
数据和云
发布2018-03-06 16:18:28
5940
发布2018-03-06 16:18:28
举报
文章被收录于专栏:数据和云数据和云

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

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

前文回顾: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的等待事件了解更深了呢

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 数据和云 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档