环境:
emp上面有外键FK_deptno,它参考了dept表上的dpetno列,在oracle 10g R2下
以下会话按顺序执行
----------------------------------------------------------------
会话1:
Select Userenv('SID') From dual --144
首先给emp上6级锁
Lock Table scott.emp In Exclusive Mode
---------------------------------------------------------------
会话2:
Select Userenv('SID') From dual --151
下面删除emp操作时阻塞了
Delete From scott.emp
---------------------------------------------------------------
会话3:
Select Userenv('SID') From dual --112
下面更新dept表的deptno字段时候出现阻塞了
Update scott.dept Set deptno=39 Where deptno=30
---------------------------------------------------------------
会话4:
Select Userenv('SID') From dual --116
下面更新dept表的dname字段(非外键涉及的字段),能成功更新并且提交。
Update scott.dept Set dname='KKK' Where deptno=30
另起会话
SQL> select * From v$lock Where Sid In(144,151,112) order by sid;
ADDR KADDR SID TYPE ID1 ID2 LMODE REQUEST CTIME BLOCK
---------------- ---------------- ---------- ---- ---------- ---------- ---------- ---------- ---------- ----------
00000000D941FEB0 00000000D941FED8 112 TM 51151 0 0 4 790 0
00000000D941FDB0 00000000D941FDD8 112 TM 51149 0 3 0 790 0
00000000D941FAB0 00000000D941FAD8 144 TM 51151 0 6 0 1126 1
00000000DAE62B48 00000000DAE62CD0 144 TX 589856 26294 6 0 1126 0
00000000D941FBB0 00000000D941FBD8 151 TM 51149 0 2 0 1111 0
00000000D941FCB0 00000000D941FCD8 151 TM 51151 0 0 3 1111 0
当ID2为0时,ID1为对象号
Select * From dba_objects aa Where aa.object_name='EMP' --51151
Select * From dba_objects aa Where aa.object_name='DEPT' --51149
结论:在更新dept表的deptno时,需要向emp上面加4级锁S,4级锁和3,5,6级锁冲突。emp表上
在第一部已经加了6级锁了。