首页 > Linux操作系统 > Linux操作系统 > 死锁的产生与消除之二
死锁的产生与消除之二
无索引的外键
-- 死锁的产生与消除2
-- session A
SQL> create table p(x int primary key);
SQL> create table c(x references p);
SQL> insert into p values (1);
SQL> insert into p values (2);
SQL> commit;
SQL> insert into c values (2);
-- session B
SQL> delete from p where x=1;
-- 会话立即发生阻塞,sqlplus 没有响应
-- 它在执行删除之前试图对表c加一个全表锁。(c表外键上无索引)
-- 现在,别的会话都不能对c del ins or update,
-- 已经开始的会话A可以继续,这就阻塞了会话B
-- 新会话无法修改表c
-- 对p表更新也会出现阻塞,没试
-- 解决阻塞
-- session A
commit;
-- session B
-- 等待结束,已删除 1 行
-- 预防,在表c上对列x加索引
-- 治疗,找出没有索引的引用修改过的demo07.sql
-- session A
SQL> create index i_c_x on c(x);
SQL> insert into c values (2);
-- session B
SQL> SQL> delete from p where x=1;
已删除0行。
-- 总结:1在外键上建索引 2尽量少在父表上改动。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/271063/viewspace-263464/ ,如需转载,请注明出处,否则将追究法律责任。