`

oracle外键引起的死锁

 
阅读更多

 

今天系统测试的时候,发现经常发送oracle的死锁,然后我打开pl/sql看是两张表;再细看它们是主从表关系。

具体的表信息如下:

 

-- 主表
create table LABLEINFOS_TABLE
(
  LABLE_ID   VARCHAR2(38) not null,
  LABLE_NAME VARCHAR2(200) not null,
  CREATOR    VARCHAR2(38) not null,
  CREATETIME DATE not null,
  EDITOR     VARCHAR2(38),
  EDITTIME   DATE,
  constraint PK_LABLEINFOS_TABLE primary key (LABLE_ID)
);

 

 

-- 从表
create table SCHEME_LABLE_RERATION_TABLE
(
  ID           VARCHAR2(38) not null,
  LABLE_ID     VARCHAR2(38),
  MA_SD_SEQ_ID VARCHAR2(38) not null,
  CREATOR      VARCHAR2(38),
  CREATTIME    DATE,
  constraint PK_SCHEME_LABLE_RERATION_TABLE primary key (ID)
);
alter table SCHEME_LABLE_RERATION_TABLE
  add constraint FK_SCHEME_L_REFERENCE_LABLEINF foreign key (LABLE_ID)
  references LABLEINFOS_TABLE (LABLE_ID);
 

 

有两存储过程需要对这两张表进行DML操作。

 

我记得tom说过:”不加索引的外键是死锁的头号原因“。

 

大概的原因知道了之后,我先把外键给删除了进行测试,果然不会发送死锁了。

 

现在把Tomas Keyte的书《Oracle 9i & 10g编程艺术》(强烈推荐)上的内容记录如下:

 

 

据Tomas 的经验,导致死锁的头号原因是外键未加索引(第二号原因是表上的位图索引遭到并发更新)。在以下两种情况下,Oracle在修改父表后会对子表加一个全表锁:

 

  • 如果更新了父表的主键(倘若遵循关系数据库的原则,即主键应当是不可变的,这种情况就很少见。)由于外键上没有索引,所以子表会被锁住。
  • 如果删除了父表中的一行,整个子表也会被锁住(由于外键上没有索引,比如:如果EMP表有DEPT的一个外键,而且在EMP表的DEPTNO列上没有任何索引,那么更新DEPT时整个EMP表都会被锁定)。
除了全表锁外,在以下情况下,未加索引的外键也可能带来问题:
  • 如果有on delete cascade,而且没有对子表加索引:例如,emp是dept的子表,delete deptno=10应该cascade(级联)至emp。如果emp中的deptno没有索引,那么删除dept表中的每一行时都会对emp做一次全表扫描。这个全表扫描可能是不必要的,而且如果从父表删除多行,父表中每删除一行就要扫描仪一次子表。
  • 从父表查询子表:在此考虑emp/dept例子。利用deptno查询emp表是相当常见的。如果频繁地运行以下查询,你就会发现没有索引会使查询速度变慢:select * from dept, emp where emp.deptno=dept.deptno and dept.deptno=:x;

-EOF-

 

  • 大小: 8.1 KB
1
2
分享到:
评论

相关推荐

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

    主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下

    oracle的几个常用命令

    将所有引用表TSYSCOREDEPT 的其他表外键失效 在Oracle中重编译所有无效的存储过程 在Oracle中重编译所有无效的视图 查询死锁现象的会话SID

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    在创建表时,经常会创建该表的主键、外键、唯一约束、Check约束等  语法结构 create table 表名( [字段名] [类型] [约束] ……….. CONSTRAINT fk_column FOREIGN KEY(column1,column2,…..column_n) ...

    Oracle 9i&10g编程艺术:深入数据库体系结构(全本)含脚本

    11.6.3 外键是否应该加索引? 475 11.6.4 为什么没有使用我的索引? 476 11.6.5 神话:索引中从不重用空间 483 11.6.6 神话:最有差别的元素应该在最前面 486 11.7 小结 490 第12章 数据类型 491 12.1 Oracle...

    oracle学习经典教程

    1.4.3.2 引起阻塞的几种常见情况..................97 1.4.3.2.1 DML 语句.....97 1.4.3.2.2 外键没有创建索引...................98 1.4.4 Latch 说明.......98 1.4.4.1 Latch.....................98...

    Oracle编程艺术

    第 1章 开发成功的Oracle应用程序...................................................... 61 1.1 我的方法................................................................................ 63 3 / 976 1.2 ...

    oracle数据库经典题目

    死锁 26. 想在另一个模式中创建表,用户最少应该具有什么系统权限?( B ) A.CREATE TABLE B. CREATE ANY TABLE C. RESOURCE D. DBA 27. 如果要启用所有角色,则应该使用哪一个命令?( B ) A.SET ROLE ALL B. ...

    Oracle第三方工具pl\sql developer绿色中文版

    表的操作功能强大,可以通过界面创建一个表,很方便的创建索引,主键,外键.重新命名表名列名.删除表列.删除 <br/>表中数据,释放表空间,显示表的授权情况,显示表的创建,索引,授权等语句,可以把文本文件,dbf文件,...

    TianleSoftware Oracle中文学习手册

    在Oracle 几年的学习中,做了很多的实验,也遇到了很多的问题, 在这个过程中,积累了一些学习文档。也更新到了blog上。 因为太多,不便于查阅。 根据自己对 Oracle 的理解,把这些 blog 进行了分类,并进行了一些...

    精通SQL 结构化查询语言详解

    18.4.4 死锁及其预防  18.5 Oracle中的并发事务控制  18.5.1 通过加锁避免写数据丢失 18.5.2 设置只读事务(READ ONLY)  18.5.3 Oracle中的隔离级别  第19章 嵌入式SQL  19.1 SQL的调用  19.1.1 直接...

    精通SQL--结构化查询语言详解

    13.5.1 oracle中用户、资源、概要文件、模式的概念 269 13.5.2 oracle中的用户管理 269 13.5.3 oracle中的资源管理 274 13.5.4 oracle中的权限管理 277 13.5.5 oracle中的角色管理 278 第14章 完整性控制 281 ...

    精通sql结构化查询语句

    1.3 数据模型 1.3.1 关系数据库模型 1.3.2 数据模型的构成 1.3.3 常见的数据模型 1.4 关系型数据库 1.4.1 关系型数据库的定义 1.4.2 关系型数据库与表 1.4.3 主键与外键 1.4.4 字段约束 1.4.5 数据的完整性 1.4.6 ...

Global site tag (gtag.js) - Google Analytics