外键引起的锁

环境:

emp上面有外键FK_deptno,它参考了dept表上的dpetno列,在oracle  10g  R2

 

以下会话按顺序执行

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

会话1

Select  Userenv('SID'From  dual  --144

 

首先给emp6级锁

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 

 

 

 

另起会话

SQLselect  *  From  v$lock  Where  Sid  In(144,151,112order  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

 

ID20时,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级锁了。

 

请使用浏览器的分享功能分享到微信等