--创建一个表,此表作为子表
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;
Oracle外键不加索引引起死锁示例
2019-12-09 15:53Oracle教程网 Oracle
这篇文章主要介绍了Oracle外键不加索引引起死锁的情况及解决,需要的朋友可以参考下
延伸 · 阅读
- 2022-06-28使用Docker制作Python环境连接Oracle镜像
- 2022-06-24MySQL 数据库查询慢(除了索引问题还可能是什么原
- 2022-03-11C++多线程之互斥锁与死锁
- 2022-03-11MySQL的索引你了解吗
- 2022-03-09阿里面试MySQL死锁问题的处理
- 2022-03-09MySQL视图和索引专篇精讲
- Oracle
oracle 多个字符替换实现
CSDN上的一个网友,需要一个sql语句的解决方案需求是这样的求写oracle多个字符替换(有测试数据) ...
- Oracle
Oracle除去数据中的换行符以免读取出现问题
将整条数据取出,并用特殊符号分割,如果数据出现换行的情况,那么读取时就有问题,这时就可以采用下面的方法来去除 ...
- Oracle
Oracle数据库的空间管理技巧
在oracle数据库中,DBA可以通过观测一定的表或视图来了解当前空间的使用状况,进而作出可能的调整决定 ...
- Oracle
Oracle与Mysql自动增长列(id)的区别
这篇文章主要介绍了Oracle与Mysql自动增长列(id)的区别,需要的朋友可以参考下 ...
- Oracle
oracle中add_months()函数及用法总结
这篇文章主要介绍了oracle中add_months()函数及用法总结,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 ...
- Oracle
Oracle 批处理自动备份bat脚本语句的步骤详解
这篇文章主要介绍了Oracle 批处理自动备份bat脚本语句的步骤详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友...
- Oracle
ORACLE 系统函数大全SQLSERVER系统函数的异同
下面是Oracle支持的字符函数和它们的Microsoft SQL Server等价函数。...
- Oracle
Oracle 获得以百分号结尾的脚本有三种写法
本节主要介绍了Oracle 获得以百分号结尾的脚本有三种写法,以获得ID=4443的数据行为例 ...