---------------------------------------------------------------------------------------------
实验环境:
---------------------------------------------------------------------------------------------
create table emp(emp_id number primary key,dept_id number); --子表
create table dept (dept_id number primary key); --主表
alter table emp add constraint emp_fk1 foreign key (dept_id) references dept(dept_id);
insert into dept values(10);
insert into dept values(20);
insert into dept values(30);
insert into emp values(1,10);
insert into emp values(2,20);
insert into emp values(3,30);
commit;
----------------------------------------------------------------------------------------------
session 1
--HR USER--
select distinct(sid) from v$mystat; 14
session 2
select distinct(sid) from v$mystat; 68
----------------------------------------------------------------------------------------------
测试一(子表外键未建索引)
session1
delete from emp where dept_id=10; --with no commit
session2
delete from dept where dept_id=30; --status hang
查看当前锁
select * from v$lock where sid in(14,68)and type in('TX','TM');
锁住.png (6.66 KB, 下载次数: 8)
2013-7-26 10:56 上传
分析:sid为 14的回话(session 1)同时对78052 78054 两张表加了LMODE=3的SX锁,block=1
说明阻碍了一个回话进程
session1做commit 锁定解除
session2提示ora-02292 违反外键约束条件
------------------------------------------------------------------------------------------
测试二(子表外键创建索引)
create index exp_fk1 on emp(dept_id);
delete from emp where dept_id=20; --with no commit
delete from dept where dept_id=10; --删除成功
未锁住.png (6.77 KB, 下载次数: 9)
2013-7-26 10:56 上传
____________________________________以上是我的实验内容___________________________________
按照实验结果来看,子表外键未建索引情况下确实引起的主表的锁定,但是为什么只是一个LMODE=3的锁呢?这个锁应该不会有这么大的能力
第二次实验,子表外键创建索引,这次主表操作正常,但是从截图来看仍然有LMODE=3的锁,所以我判定锁住主表的关键锁不是此锁
求解释??到底是那个锁?我认为更像是一个表级别独占锁,但是臣妾找不到啊!!