今天系统测试的时候,发现经常发送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
分享到:
相关推荐
本文将深入探讨Oracle外键不加索引引起死锁的情况,并提供解决方案。 首先,我们需要理解外键和主键的关系。在关系型数据库中,主键是表中的一个或一组列,其值唯一标识表中的每一行。外键则是另一表中指向主键的...
"oracle死锁表后处理" oracle死锁表后处理是指在oracle数据库中处理死锁表的各种方法和技巧。oracle死锁表后处理是数据库管理员和开发人员需要掌握的重要技能,旨在解决oracle数据库中出现的死锁问题,确保数据的...
- 为从表的外键字段创建索引,这样Oracle在检查外键约束时可以高效地访问,避免全表扫描和锁升级,从而减少死锁的可能性。 - 监控和检测死锁:使用`v$session_wait`视图或`DBA_BLOCKERS`视图来检测死锁,并使用`...
还将介绍数据类型、主键和外键等关系数据库设计的基础概念。 四、数据库安全性 Oracle提供了强大的用户权限管理机制,包括用户账户的创建与管理,角色的定义,以及权限的分配和撤销。安全性的概念是学习Oracle的...
- **死锁检测和避免**:系统自动检测并解决死锁情况。 5. **分区**: - **分区技术**:包括范围分区、散列分区、列表分区和复合分区,提高大规模数据的管理效率和查询性能。 6. **PL/SQL和Java**: - **PL/SQL*...
8. **并发控制**:学习Oracle的锁定机制、事务管理和并发控制,理解死锁问题及其解决办法。 9. **安全性管理**:了解用户权限管理、角色分配、审计机制,以及如何设置安全策略防止未授权访问。 10. **高可用性与...
4. 事务处理与并发控制:理解事务的概念,学习如何控制事务的提交和回滚,以及Oracle的锁定机制和死锁处理。 5. 性能优化:通过实验了解SQL查询优化,使用 Explain Plan 分析查询执行计划,调整索引和表分区,以及...
- 结果:会话1和会话2都将被阻塞,Oracle将检测到死锁,并报告ORA-00060错误。 #### 八、Update句中尽量不包含主键的列 当更新父表中的主键(即使值不变),子表的相关操作(如插入或更新记录)会被阻塞。同样地...
书中将指导你如何规划和创建数据库模式,包括主键、外键和唯一性约束的设置。此外,你还将学习到索引的使用,以优化查询性能。 安装和配置Oracle 11g也是学习的一部分。这个过程涉及选择合适的安装选项、配置网络...
Oracle 11g提供了一致性保证和死锁避免机制,理解事务的ACID属性(原子性、一致性、隔离性和持久性),以及行级锁定和多版本并发控制(MVCC)原理,对于提升系统并发性能至关重要。 最后,Oracle 11g还支持高级特性...
3. 列(Column):列定义了表中的字段,每个列都有一个名字、数据类型和可能的约束条件,如非空(NOT NULL)、主键(PRIMARY KEY)或外键(FOREIGN KEY)。 4. 索引(Index):索引是提高查询速度的关键,它创建在...
5. Oracle的锁定机制和死锁检测。 6. Oracle的SQL语句中的绑定变量(如:x)用于提高性能和安全性。 7. Oracle的SQL语句中可以使用日期函数(如TO_DATE)和数学函数。 8. Oracle的跟踪文件(trace files)用于诊断...
这部分内容会讲解Oracle的锁定机制,死锁的预防和解决,以及多版本并发控制(MVCC)在Oracle中的实现。事务管理则包括事务的ACID属性,以及提交和回滚操作的细节。 最后,书中可能还会包含一些实战案例和最佳实践,...
1. 锁机制:理解Oracle中的行级锁、表级锁和多版本并发控制(MVCC),以及死锁的概念和处理。 2. 事务管理:掌握ACID特性,理解提交、回滚和保存点的概念。 通过Word文档,你可以详细阅读Oracle的理论知识,而PPT...
6. **事务和并发控制**:理解事务的ACID特性(原子性、一致性、隔离性、持久性),以及Oracle中的锁定机制和死锁处理。 7. **备份与恢复**:学习如何进行数据库备份,理解完整备份、增量备份和差异备份的区别,以及...
Oracle9i支持实体完整性(如主键约束)、参照完整性(外键约束)和用户定义的完整性(如检查约束)。此外,Oracle9i还提供了行级锁定和事务管理,以确保在并发操作中维持数据完整性。 5. **Oracle9i的并发控制**: ...
8. **并发控制**:学习Oracle的事务处理和并发控制机制,包括锁定、死锁和行级锁定的概念,以及多版本并发控制(MVCC)如何解决读写冲突。 9. **数据库备份与恢复**:掌握Oracle的备份策略,包括冷备份、热备份、...
2. **表的创建与管理**:包括CREATE TABLE语句的使用,定义字段的数据类型,约束条件(如主键、外键、唯一性约束、非空约束等)以及如何使用ALTER TABLE修改已存在的表结构。 3. **索引**:索引能显著提高查询性能...
- 创建和管理表,包括定义主键、外键、唯一性约束和检查约束。 - 学习如何使用ALTER TABLE修改已存在的表结构。 4. **存储过程和函数** - PL/SQL是Oracle的编程语言,用于编写存储过程、函数和触发器。 - 理解...