在看oracle concept 的时候发现了这么一个情况。在主表和从表(从表通过外键引用了主表的主键)这样的关系中。如果主表被修改,会在从表上施加一个表级锁(如果从表的外键列没有施加索引的话)。如果在外键上有索引,则不会施加这个锁。不知道为什么。
经过测试,发现,确实会施加这么一个表级锁(如果从表的外键列没有施加索引的话)。一个session在修改主表的未被引用记录时,会在从表上施加一个S锁。但是这个S锁是瞬间的,也就是说不是在commit 或者rollback之后才会撤销的,而是在语句结束就会撤销。所以如果你正常情况下去查看v$lock是发现不了这个锁的。想看到这个锁的情况只有是在从表上先申请一个锁,这样修改主表的session去在从表上申请S锁时,会被block。这时就可以从v$session中看见这个锁了。
测试过程如下,
1. 创建两个表
create table parent( x int primary key );
create table child (y reference parent);
2.在parent表中插入数据并commit。
insert into parent values(1);
insert into parent values(2);
commit;
3.在从表中插入数据但不commit
insert into child values(1);
4.修改主表
delete from parent where x=2;
按理说这个x=2没有被child引用,应该可以被修改,但是这里会卡住,直到child被提交这里才能继续。这时去查v$lock就可以看到一个S锁。
1143

被折叠的 条评论
为什么被折叠?



