[20140210]主外键和阻塞.txt

[20140210]主外键和阻塞.txt

许多人都知道如果几个表之间存在主外键关系的情况下,许多情况下会出现阻塞情况。
具体的例子还很多,当然如果我觉得最常见如果你不修改主外键值,外键的索引多数情况下可以不建。
而且有些外键的索引建立有点多余的。

今天我看了一篇blog,链接如下:
http://blog.yavor.info/?p=564&lang=en

给出的例子很奇特,就是这个问题在11g下会出现阻塞,而10g下不会。12c下我也做了测试,也不会,
自己重复测试做一个记录:

1.12c的情况:
SCOTT@test01p> @ver
BANNER                                                                               CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production              0

--数据准备
drop table t2 purge;
drop table t1 purge;
create table t1 (pk number primary key);
create table t2 (pk number primary key, fk number references t1(pk));
 
insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);
insert into t1 values (4);
 
insert into t2 values (11, 1);
insert into t2 values (21, 2);
insert into t2 values (22, 2);
insert into t2 values (31, 3);
insert into t2 values (32, 3);
insert into t2 values (33, 3);
commit;

--会话1:
insert into t1 values (5);

--会话2:
delete from t1 where pk=4;

--没有出现阻塞情况!
--从这里看确实出现了修改主外键值的情况。但是没有阻塞的情况。
--其实我的理解这是非常特殊的情况,插入的值一定不能重复在t1表,也就是不会出现T2中,
--当然也有许多特殊情况,比如延迟references等等,先插入T2表的数据,在插入T1表数据,
--好像这样操作很少。
--这样的插入T1表不应该"阻塞"T2表。如果不"阻塞"T2表,delete from t1 where pk=4;时候
--就不会出现这种情况。出现"阻塞"的情况:

--会话1:
delete from t2 where fk=1;
1 row deleted.

--会话2:
delete from t1 where pk=4;
--hung!因为级联删除t2表的fk=4,t2表没有fk的索引,oracle要"lock"表t2.

2.11g的情况:
SCOTT@test> @ver
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

--重复以上测试,出现阻塞情况。

3.10g的情况:
@ver

BANNER
-----------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bi

--重复以上测试,没有出现阻塞情况。

4.总结:
感觉oracle在开发上存在一些问题,也许不知道内部如何管理的。10g已经解决的问题,11g又出现。
难道10.2.0.1的版本也有问题吗?手头已经没有这些版本,无法再测试。

时间: 2024-09-20 08:56:29

[20140210]主外键和阻塞.txt的相关文章

[20151231]主外键与空表.txt

[20151231]主外键与空表.txt --主外键的测试例子很多,今天做一个特别的,外部键表为空,也会出现阻塞吗?测试看看. 1.建立环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ------------------------------ -------------- -------------------------------------------------------

[20160719]主外键与延迟约束2.txt

[20160719]主外键与延迟约束2.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@book> @ &r/ver1 PORT_STRING                    VERSION        BANNER ---------------

[20160704]NULL与主外键问题.txt

[20160704]NULL与主外键问题.txt --主外键的问题主要出现在阻塞等情况,有许多极端dba认为应该取消这个约束.当然从使用的角度出发有总比没有好.只是不要过度滥用. --我这里遇到一个问题,开发指出主外键"失效",我仔细检查发现建立的主表索引是唯一,而非主键,这样可以插入NULL,导致所谓的"失效". --我开始意味是因为oracle索引不记录NULL而导致的(主键仅仅一个字段).实际上我的测试还是有点意外: 1.环境: SCOTT@book>

[20151231]主外键与空表(12c).txt

[20151231]主外键与空表(12c).txt --主外键的测试例子很多,今天做一个特别的,外部键表为空,也会出现阻塞吗?测试看看. 1.建立环境: SCOTT@test01p> @ver1 PORT_STRING                    VERSION        BANNER                                                                               CON_ID --------------

[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    

[20160716]主外键与延迟约束.txt

[20160716]主外键与延迟约束.txt --前几天遇到的问题,因为开发没有在2个存在主外键上的表上建立约束,导致主表记录删除了,而外表数据还在. --主要开发有需求要删除主表的记录,由于条件写错,导致以上情况出现.实际上oracle支持延迟约束,只有提交的时候才会检查. --自己通过例子说明: 1.环境: SCOTT@test01p> @ ver1 PORT_STRING           VERSION    BANNER                                

[20121020]主外键约束以及NULL问题.txt

[20121020]主外键约束以及NULL问题.txt 主外键约束可以一定程度保证数据完整性,但是如果外键输入的是NULL,情况会如何呢? SQL> select * from v$version ; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 6

城市,区县,地址,没有主外键区分,没有父级ID,所以数据在一个表如何实现级联查询?

问题描述 城市,区县,地址,没有主外键区分,没有父级ID,所以数据在一个表如何实现级联查询? 城市,区县,地址,没有主外键区分,没有父级ID,所以数据在一个表如何实现级联查询? 解决方案 一般这样的情况都是三张表.如果你要放在一张表里面,那么你肯定会有一个父级ID的呀.不然怎么区分,怎么级联? 解决方案二: 都在一个表,我也很纳闷,接手的项目数据库是这样,表示压力好大 解决方案三: 一般不是全在一张表,用level和parentId来区分关联:就是三张表,parentId关联. 没有parent

在PowerDesigner中设计物理模型1——表和主外键

原文:在PowerDesigner中设计物理模型1--表和主外键 在PD中建立物理模型由以下几种办法: 直接新建物理模型. 设计好概念模型,然后由概念模型生成物理模型. 设计好逻辑模型,然后由逻辑模型生成物理模型. 使用逆向工程的方法,连接到现有的数据库,由数据库生成物理模型. 物理模型能够直观的反应出当前数据库的结构.在数据库中的表.视图.存储过程等数据库对象都可以在物理模型中进行设计.由于物理模型和数据库的一致性,接下来以数据库对象和物理模型对象的对应来一一介绍: 表 新建物理模型时需要指定