ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 外键引起的锁

外键引起的锁

原创 Linux操作系统 作者:wadekobe9 时间:2012-04-12 16:11:20 0 删除 编辑

环境:

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

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10678398/viewspace-720993/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-11-30

  • 博文量
    36
  • 访问量
    69955