张大朋(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的等待事件了解更深了呢