ITPub博客

首页 > 应用开发 > IT综合 > 这种外键(Foreign Key)方法能不能造成死锁

这种外键(Foreign Key)方法能不能造成死锁

原创 IT综合 作者:charsi 时间:2010-07-13 17:50:34 0 删除 编辑

网上看了一篇文章(http://blog.csdn.net/youjianbo_han_87/archive/2010/03/17/5390993.aspx),关于使用外键造成死锁的分析.
按照上面的方法做了一遍,却模拟不出来死锁,只能模拟出session blocking的情况.不知道所以然,将我做的过程贴出来.

数据库版本:10.2.0.1
SQL> select * from v$version;

BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
CORE 10.2.0.1.0 Production
TNS for Linux: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

----创建主表
SQL> create table p_test(p_id number not null,p_desc varchar2(20));
Table created.
SQL> alter table p_test add primary key(p_id);
Table altered.

----创建从表
SQL> create table c_test(p_id number not null,c_id number default 0 not null,c_desc varchar2(25));
Table created.
SQL> alter table c_test add primary key(p_id);
Table altered.
SQL> alter table c_test add foreign key(p_id) references p_test(p_id) on delete set null;
Table altered.

----向主表中插入数据
SQL> insert into p_test values(1,'aaa');
1 row created.
SQL> insert into p_test values(2,'bbb');
1 row created.
SQL> insert into p_test values(3,'ccc');
1 row created.
SQL> commit;
Commit complete.

------启动另外一个session,然后向c_test从表中插入一条数据,不执行commit;
SQL> insert into c_test values(1,5,'xxx');
1 row created.

------再到另外一个session上,删除主表种对应的一条数据,会发现session僵住
SQL>
SQL> delete p_test where p_id=1;

-----检查锁
SQL> select a.object_name,b.session_id,b.locked_mode from all_objects a,v$locked_object b where a.object_id=b.OBJECT_ID;
OBJECT_NAME SESSION_ID LOCKED_MODE
------------------------------ ---------- -----------
P_TEST 258 2
C_TEST 258 3
P_TEST 269 3
C_TEST 269 2

SQL> select sid,type,block from v$lock where block=1;
SID TYPE BLOCK
---------- ---- ----------
258 TX 1

发现此时后面执行的那条语句被block了。但并不是死锁.此时如果对第一条语句执行commit或rollback,锁的情况就会消失.因此对这块不太明白,难道是我做的实验错了?还是什么原因?

[@more@]

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

上一篇: Oracle数据库发展
请登录后发表评论 登录
全部评论

注册时间:2010-05-04

  • 博文量
    96
  • 访问量
    406716