1。模拟死锁
1。1。主表
-- Create table
create table WDZ1
(
WDZ1ID NUMBER not null,
MEMO VARCHAR2(20)
)
;
alter table WDZ1
add constraint XXXXXX primary key (WDZ1ID);
1。2。从表(没有外健的索引)
-- Create table
create table WDZ2
(
WDZ2ID NUMBER not null,
WDZ1ID NUMBER,
MEMO VARCHAR2(20)
)
;
-- Create/Recreate primary, unique and foreign key constraints
alter table WDZ2
add constraint XXXXX primary key (WDZ2ID)
;
alter table WDZ2
add constraint XXX foreign key (WDZ1ID)
references WDZ1 (WDZ1ID);
1。3。插入数据表到住表
begin
insert into wdz1 values (1,'aa');
insert into wdz1 values(2,'aa2');
insert into wdz1 values (3,'aa3');
insert into wdz2 values(10,3,'wdz3--1');
commit;
end;
1。4。在一个数据库seeesion里面插入数到从表,但是不提交事务
begin
update wdz2 set memo='update wdz2 momo'
where wdz2id=10;
insert into wdz2 values(20,2,'wdz2--1');
end;
对从表进行插入/修改记录,施加的锁也就是行级锁
1。5。在另外一个数据库seeesion里面删除 主表数据
delete from wdz1 where wdz1id=1
这时候 程序会死锁,除非 上面的 对从表的 数据操作提交事务或者回滚事务。
2。具体原因分析
一个数据表的外键主要有3种方式来维护它自己和主表数据的一致性。
(1)delete cascade
例子如下:
alter table WDZ2
add constraint XXX foreign key (WDZ1ID)
references WDZ1 (WDZ1ID) on delete cascade;
(2)Set null
例子如下:
alter table WDZ2
add constraint XXX foreign key (WDZ1ID)
references WDZ1 (WDZ1ID) on delete set null;
(3)No action
注意,这是oracle外键使用时候的默认选项。
例子如下:
alter table WDZ2
add constraint XXX foreign key (WDZ1ID)
references WDZ1 (WDZ1ID);
以前出现死锁主要是我们认为,在 1。4。会对数据表wdz2进行施加行级锁,但是从表(wdz2)的外健是No action,删除主表(wdz1)不会去访问从表,更不会去锁定 wdz2表的记录或者对整个数据从表(wdz2)施加表级锁。事实上 oralce的No action 选项的字面意思欺骗了我们,oracle在删除主表的时候
会去寻找所有以主表的主键作为外键的数据表,然后看去看从表
是否有该外键的索引,如果没有则会对整个从表施加表级锁,然后
对从表进行全表扫描。当然如果从表存在外键的索引,会去访问
对应的索引,而不会对从表本身进行加锁。
3。解决办法
为从表的外键建立索引,这也是在使用外键的推荐方式。
这样就能避免上面出现的问题了。
分享到:
相关推荐
当多个事务请求对同一资源进行访问时,可能会出现等待的情况,即一个事务正在等待另一个事务释放锁,而后者也在等待前者释放锁,这种现象被称为“死锁”。为了保证数据的一致性和完整性,Oracle数据库提供了一系列...
### Oracle死锁原因及解决办法 #### 一、Oracle死锁概述 在Oracle数据库系统中,死锁是一种常见的并发问题,它会导致多个事务之间互相等待对方释放资源而无法继续执行,最终导致整个系统的运行效率降低甚至停滞。...
### Oracle死锁故障分析与诊断解决 在Oracle数据库管理中,死锁是一个常见的问题,它发生在两个或多个事务互相等待对方释放资源时,导致所有事务都无法继续执行的情况。本文将深入探讨Oracle死锁的原因、诊断方法及...
总结,ORACLE数据库中的死锁分析与改进是一个复杂而关键的问题。通过深入理解事务、锁的概念,结合实际应用系统的特性,制定合理的资源管理和事务控制策略,能够有效地避免和解决死锁问题,从而提高系统的稳定性和...
本文将深入探讨并发访问Oracle数据库时数据死锁的原因,并提出有效的分析和解决措施,以期为相关技术人员提供专业指导和参考文献。 首先,要理解数据死锁的概念。在关系型数据库的多个事务中,若每个事务都在等待...
本文将深入探讨Oracle表死锁的原因、检测以及解决方法。 首先,我们需要了解死锁的基本概念。死锁是当两个或更多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉它们都无法继续执行。在...
在Oracle数据库系统中,"ORA-00060: 等待资源时检测到死锁" 是一个常见的错误提示,它表明两个或多个事务在执行过程中陷入了无法继续进行的状态,因为彼此都在等待对方释放资源。这种情况通常发生在并发操作中,比如...
Oracle数据库死锁是数据库系统中常见的问题,它发生在两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外力干预,这些事务都将无法继续执行,形成一种僵局。了解如何...
### Oracle如何解除死锁 在Oracle数据库环境中,死锁是一...通过以上分析,我们可以看到在Oracle数据库中如何识别和解决死锁问题。在实际应用中,还需要根据具体情况灵活运用这些方法,并结合业务需求做出合理的决策。
在Oracle数据库管理与维护的过程中,查询并解决死锁问题是至关重要的一环。死锁是指两个或多个事务在执行过程中因争夺资源而造成的一种僵局状态,若不及时处理,将直接影响到系统的性能和稳定性。本文将围绕“Oracle...
在Oracle数据库系统中,死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种相互等待的现象。当这种情况发生时,如果没有外部干预,这些事务将无法继续执行,因为它们都在等待对方释放资源。本篇将详细介绍...
5. **Oracle锁类型** - 用户锁和系统锁:根据用户与系统的不同,Oracle的锁分为用户锁(如行级锁、表级锁)和系统锁(如系统资源锁)。 - 行级锁:锁定单个数据行,允许其他事务同时访问表的其他行。 - 表级锁:...
通过以上分析和建议,我们可以有效地检测、解决并预防ORACLE表的死锁问题,从而提高数据库系统的稳定性和性能。在实际操作中,这些方法已经被证明是亲测有效的,能够显著提升数据库管理的效率和效果。
- **使用锁超时**:设置合理的锁等待超时时间,超过该时间则回滚事务。 - **死锁检测与自动解锁**:启用Oracle数据库的死锁检测功能,自动解除死锁。 通过以上方法,不仅可以有效检测到Oracle数据库中的死锁问题,...
本文将深入探讨Oracle数据库中的死锁现象,包括如何查询死锁、分析死锁原因以及如何解锁死锁,确保数据库的正常运行。 ### 一、Oracle死锁查询 当怀疑Oracle数据库中存在死锁时,可以使用以下SQL查询来检查哪些...
本文将深入探讨Oracle锁的类型、工作原理以及相关的管理工具。 一、Oracle锁的类型 1. 表级锁:Oracle中的表级锁主要有两种,即排他锁(Exclusive Locks, X locks)和共享锁(Shared Locks, S locks)。排他锁允许...
### Oracle锁表处理 在Oracle数据库管理中,锁机制是一种重要的资源管理手段,用于控制并发事务对数据资源的访问,防止多个用户同时修改相同的数据,从而确保数据的一致性和完整性。然而,在高并发环境下,锁的争用...
在处理并发问题时,应谨慎使用锁,避免出现死锁情况,死锁是两个或多个事务等待对方释放资源而无法继续执行的情况。Oracle提供了一些死锁检测和解决机制,例如死锁链路检测和超时机制,以减少死锁的影响。 总之,...