关于外键索引的问题

[复制链接]
查看11 | 回复4 | 2009-10-8 19:42:37 | 显示全部楼层 |阅读模式
我也在看tom的书 看到第6章锁有一个问题没有明白
导致死锁的头号原因是外键未加索引。
试验如下:
create table p (x int primary key);
create table c (x references p);
insert into p values (1);
insert into p values (2);
commit;
insert into c values (2);
此时就会发现,这个会话立即被阻塞了。
我在c表x上加了一个索引
create index ref_x onc(x);
就没有这样的问题了。
我现在不理解为什么。有什么可以给解释一下原因吗。
回复

使用道具 举报

千问 | 2009-10-8 19:42:37 | 显示全部楼层
写漏了一句
insert into c values (2);
在另一个会话中
--->写漏的
delete from p where x =1; --->写漏的
此时就会发现,这个会话立即被阻塞了。
回复

使用道具 举报

千问 | 2009-10-8 19:42:37 | 显示全部楼层
没有高手给指导一下吗 分析一下原理。
回复

使用道具 举报

千问 | 2009-10-8 19:42:37 | 显示全部楼层
子表无索引,主表更新、删除要要对子表加一个共享行排他表级锁,此锁会阻塞
子表有索引,主表更新、删除要要对子表加一个行共享表级锁,此锁不允许其他事务排他地对子表加锁,但允许对父表及子表执行更新、删除操作。
回复

使用道具 举报

千问 | 2009-10-8 19:42:37 | 显示全部楼层
没有索引的时候
insert into c values (2);执行后v$lock里面的信息
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
1
138
TM
55084
0
Row share
0
9
0
2
138
TM
55087
0
Row Exclusive
0
9
0
3
138
TX
262148
1360
Exclusive
0
9
0
delete from p where x =1;执行后v$lock里面的信息
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
1
138
TM
55084
0
Row share
0
45
0
2
138
TM
55087
0
Row Exclusive
0
45
1
5
138
TX
262148
1360
Exclusive
0
45
0
3
153
TM
55084
0
Row Exclusive
0
6
0
4
153
TM
55087
0
None
4
6
0
有索引的时候
insert into c values (2);执行后v$lock里面的信息
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
1
138
TM
55084
0
Row share
0
66
0
2
138
TM
55087
0
Row Exclusive
0
66
0
3
138
TX
458794
1378
Exclusive
0
66
0
delete from p where x =1;执行后v$lock里面的信息
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
1
138
TM
55084
0
Row share
0
30
0
2
138
TM
55087
0
Row Exclusive
0
30
0
6
138
TX
458794
1378
Exclusive
0
30
0
3
153
TM
55084
0
Row Exclusive
0
15
0
4
153
TM
55087
0
Row share
0
15
0
5
153
TX
655406
1357
Exclusive
0
15
0
比较了一下
第一步操作加的锁都一样
第二步操作无索引的时候
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
4
153
TM
55087
0
None
4
6
0
有索引的是
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
4
153
TM
55087
0
Row share
0
15
0
5
153
TX
655406
1357
Exclusive
0
15
0
并且无索引的c表 block=1
SID
TY
ID1
I D2
LOCK_TYPE
REQUESTCTIMEBLOCK
2
138
TM
55087
0
Row Exclusive
0
45
1
没有明白为什么
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行