Oracle外键不加索引引起死锁示例_oracle

--创建一个表,此表作为子表

create table fk_t as select *from user_objects;

delete from fk_t where object_id is null;

commit;

--创建一个表,此表作为父表

create table pk_t as select *from user_objects;

delete from pk_t where object_id is null;

commit;

--创建父表的主键

alter table PK_t add constraintpk_pktable primary key (OBJECT_ID);

--创建子表的外键

alter table FK_t addconstraint fk_fktable foreign key (OBJECT_ID) references pk_t (OBJECT_ID);

--session1:执行一个删除操作,这时候在子表和父表上都加了一个Row-S(SX)锁

delete from fk_t whereobject_id=100;

delete from pk_t where object_id=100;

--session2:执行另一个删除操作,发现这时候第二个删除语句等待

delete from fk_t whereobject_id=200;

delete from pk_t whereobject_id=200;

--回到session1:死锁马上发生

delete from pk_t whereobject_id=100;

session2中报错:

SQL> delete from pk_table where object_id=200;
delete from pk_table where object_id=200
*
第 1 行出现错误:

ORA-00060: 等待资源时检测到死锁

当对子表的外键列添加索引后,死锁被消除,因为这时删除父表记录不需要对子表加表级锁。

--为外键建立索引

create index ind_pk_object_id on fk_t(object_id) nologging;

--重复上面的操作session1

delete from fk_t whereobject_id=100;

delete from pk_t whereobject_id=100;

--session2

delete from fk_t whereobject_id=200;

delete from pk_t whereobject_id=200;

--回到session1不会发生死锁

delete from pk_t whereobject_id=100;

时间: 2024-09-21 21:09:44

Oracle外键不加索引引起死锁示例_oracle的相关文章

ORACLE中关于外键缺少索引的探讨和总结

    在ORACLE数据库中,定义外键约束时,ORACLE是不会自动创建对应索引的,必须手动在外键约束相关的列上创建索引.那么外键字段上是否有必要创建索引呢?如果有必要的话,巡检时,如何找出外键字段上没有创建索引的相关表,并生成对应的索引的脚本呢?   外键缺失索引影响   外键列上缺少索引会带来三个问题,限制并发性.影响性能.还有可能造成死锁.所以对于绝大部分场景,我们应该尽量考虑在外键上面创建索引   1. 影响性能. 如果子表外键没有创建索引,那么当父表查询关联子表时,子表将进行全表扫描

Oracle外键约束修改行为(三)CASCADE操作

Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 这篇简单描述一下CASCADE操作. 上一篇描述了Oracle外键处理操作:SET TO NULL,这里简单介绍一下CASCADE操作.还是利用前面例子的表,不过约束需要重建. SQL> DROP TABLE T_C; 表已删除. SQL> DROP TABLE T_P; 表已删除. SQL> CREATE TABLE T_P (ID NUM

Oracle外键约束修改行为(二)SET TO NULL操作

Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 这篇简单描述一下SET TO NULL操作. 上一篇描述了Oracle外键处理默认操作:No Action,这里简单介绍一下SET TO NULL操作.还是利用前面例子的表,不过约束需要重建. SQL> DROP TABLE T_C; 表已删除. SQL> DROP TABLE T_P; 表已删除. SQL> CREATE TABLE T_P

聊聊Oracle外键约束的几个操作选项

关系型数据库是以数据表和关系作为两大对象基础.数据表是以二维关系将数据组织在DBMS中,而关系建立数据表之间的关联,搭建现实对象模型.主外键是任何数据库系统都需存在的约束对象,从对象模型中的业务逻辑加以抽象,作为物理设计的一个部分在数据库中加以实现. Oracle外键是维护参照完整性的重要手段,大多数情况下的外键都是紧密关联关系.外键约束的作用,是保证字表某个字段取值全都与另一个数据表主键字段相对应.也就是说,只要外键约束存在并有效,就不允许无参照取值出现在字表列中.具体在Oracle数据库中,

求大神:在sqlserver中怎么快速加外键和索引

问题描述 求大神:在sqlserver中怎么快速加外键和索引 建立了四张表,怎么操作给表关联外键,和创建索引.不用写代码的 ,直接在工具上操作的步骤是什么

外键加索引问题

根据9I/10G 编程艺术所说,如果不加索引 1.主建删除比如DELETE TEST WHERE ID=1 CASCADE,会导致外键表全表扫描,影响性能 2.主键在更改期间,外键表加锁,DML操作完成后释放(不是COMMIT,是DML操作完成) 对于第一点,我觉得有些小问题,我认为DELETE TEST WHERE ID=1这样的语句同样会导致全表扫描,因为为了保证主表记录可以删除,必须去全表扫描外键表(因为没有索引),来确定没有记录和其匹配 如果匹配当然就报错不能删除,这一点可以通过TKPR

讲解SQL与Oracle外键约束中的级联删除

最近软件系统中要删除一条记录,就要关联到同时删除好多张表,它们之间还存 在着约束关系.所以考虑到在创建表时加上约束关系,详细内容如下: SQL的外键约束可以实现级联删除与级联更新; ORACLE则只充许级联删除. SQL级联删除与级联更新使用格式: CREATE TABLE A001(ID INT PRIMARY KEY,NAME VARCHAR(20)) CREATE TABLE A002(ID INT REFERENCES A001(ID)ON DELETE CASCADE ON UPDAT

Oracle外键约束修改行为(六)如何实现SET DEFAULT

Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作. 这篇描述一下如何实现SET DEFAULT. 前面几篇文章介绍了Oracle所支持的3种约束行为NO ACTION.DELETE SET NULL和DELETE CASCADE. 至于SQL标准中定义的其他操作,Oracle只能通过触发器来实现,这里给出一个简单的SET DEFAULT操作的例子. SQL> DROP TABLE T_C; 表已删除.

Oracle外键约束修改行为(四)如何实现UPDATE CASCADE

Oracle的外键用来限制子表中参考的字段的值,必须在主表中存在.而且在主表的记录发生变化导致外键参考唯一约束值发生了变化时,定义了一系列的动作.    这篇描述一下如何实现UPDATE CASCADE.         前面几篇文章介绍了Oracle所支持的3种约束行为NO ACTION.DELETE SET NULL和DELETE CASCADE.    至于SQL标准中定义的其他操作,Oracle只能通过触发器来实现,这里给出一个简单的UPDATE CASCADE操作的例子.    SQL