主键(primary key)外键(foreign key)之间S锁(lock)的关系

在看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锁。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值