Oracle中和外键相关的阻塞和死锁问题总结

外键上没有index操作主表数据时常会引起阻塞和deadlock问题

外键引起的阻塞:

session 1:

SQL> create table p(id int primary key ) tablespace users;

表已创建。

SQL> create table r(id int references p on delete cascade) tablespace users;

表已创建。

SQL> insert into p values(1);

已创建 1 行。

SQL> insert into p values(2);

已创建 1 行。

SQL> insert into p values(3);

已创建 1 行。

SQL> commit;

提交完成。

SQL> select distinct sid from v$mystat;

SID

----------

159

SQL> select * from p;

ID

----------

1

2

3

SQL> delete from p where id=1;

已删除 1 行。

SQL>

--=======================

session 3:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in

2 (159,128) order by sid;

SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

---------- -- ---------- ---------- ---------- ---------- ---------- ----------

159 TM 13017 0 3 0 9 0

159 TX 589854 449 6 0 9 0

159 TM 13020 0 3 0 9 0

SQL> col object_name format a10

SQL> select object_id,object_name from dba_objects where object_id in (13017,130

20);

OBJECT_ID OBJECT_NAM

---------- ----------

13017 P

13020 R

--=========================

很明显session 1中的语句delete from p where id=1;在字表r上加了锁,mode为3;

--=========================

session 2:

SQL> select distinct sid from v$mystat;

SID

----------

128

SQL> delete from p where id=2;

等待、被session 1阻塞了

--=========================

session 3:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in

2 (159,128) order by sid;

SID TY ID1 ID2 LMODE REQUEST CTIME BLOCK

---------- -- ---------- ---------- ---------- ---------- ---------- ----------

128 TM 13017 0 3 0 9 0

128 TM 13020 0 0 5 9 0

159 TX 589854 449 6 0 90 0

159 TM 13020 0 3 0 90 1

159 TM 13017 0 3 0 90 0

SQL>

很明显session 2中的语句delete from p where id=2;请求锁mode为5被

session 1中的语句delete from p where id=1加在r上的锁mode为3阻塞了;

由于mode 3对应的RX(row exclusive)和mode 5对应的SRX(share row exclusive)不能兼容,因此

session 2被阻塞了。

--=========================

外键引起的死锁:

rollback掉上面session 1和session 2中的sql

--=========================

session 1:

SQL> insert into r values(2);

已创建 1 行。

SQL>

--=======================

session 3:

SQL> select sid,type,id1,id2,lmode,request,ctime,block from v$lock where sid in

返回栏目页:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

时间: 2024-11-10 07:36:40

Oracle中和外键相关的阻塞和死锁问题总结的相关文章

[20160616]IOT与主外键.txt

[20160616]IOT与主外键.txt https://ilmarkerm.eu/blog/2016/06/interesting-difference-in-foreign-key-locking-behavior-between-heap-and-index-organized-tables --许多人都知道主外键引起的阻塞或者死锁,如果主表是IOT呢? IOT实际上一种特殊的索引结构,测试看看. 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING    

关于oracle外键引用与goldengate

  一.准备知识 约束放置在表中,有以下五种约束: NOT NULL 非空约束C 指定的列不允许为空值 UNIQUE 唯一约束U 指定的列中没有重复值,或该表中每一个值或者每一组值都将是唯一的 PRIMARY KEY 主键约束P 唯一的标识出表的每一行,且不允许空值值,一个表只能有一个主键约束 FOREIGN KEY 外键约束R 一个表中的列引用了其它表中的列,使得存在依赖关系,可以指向引用自身的列 CHECK 条件约束C 指定该列是否满足某个条件 约束命名规则 如果不指定约束名Oracle s

Oracle批量执行sql语句之禁用所有表的外键_oracle

在转移数据库,进行数据导入的时候,遇到一件麻烦事,就是表间外键约束的存在,导致insert频频报错,批量执行sql语句又是顺序执行,没办法我只好手动输入. 然后输入到一半灵光一闪,为什么不先把外键约束全部禁用先呢? 于是我百度到以下资料: oracle 删除(所有)约束 禁用(所有)约束 启用(所有)约束 执行以下sql生成的语句即可 1删除所有外键约束 select 'alter table '||table_name||' drop constraint '||constraint_name

Oracle数据库中外键的相关操作整理_oracle

racle使用外键来限制子表中参考的字段值,要求子表中的数据必须在主表中存在.当主表的记录发生变化时导致外键参考唯一约束值发生了变化时,Oracle指定了三种动作:默认值(类似于restrict).delete cascade和delete set null.( 1.创建父表并初始化数据 SQL> create table t_parent (parent_id int primary key, name varchar2(10)); Table created. SQL> insert in

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

Oracle外键约束修改行为(五)实现UPDATE SET NULL

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

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