暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 外键约束DDL和锁

askTom 2018-02-28
566

问题描述

对于DDL运行以添加FK约束 (在unindexedcolumn上) 的时间段,第二个会话无法读取子表和父表。

这种行为是预期的/记录的吗?
无论如何都有避免问题 (这表明应用程序对用户不可用)。

livesql中的NB测试用例未运行到完成 (配额),并且我不知道如何启动第二个会话以尝试在第一个会话中读取表。

专家解答

是的。

添加外键会在父表和子表上产生排他锁。您可以通过在创建FK时查询dba_ddl_locks来看到这一点:

select * from dba_ddl_locks
where  session_id = 108
and    ( mode_held <> 'Null' or mode_requested <> 'None' );

SESSION_ID   OWNER    NAME    TYPE                   MODE_HELD   MODE_REQUESTED   
         108 CHRIS    PT      Table/Procedure/Type   Exclusive   None             
         108 CHRIS    CT      Table/Procedure/Type   Exclusive   None             
         108    CHRIS   73                     Share       None


正如医生所说:

An exclusive DDL lock prevents other sessions from obtaining a DDL or DML lock.

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/cncpt/data-concurrency-and-consistency.html#GUID-5015CC53-4059-4CD6-B892-F211E8BDE2F9

但是有一个变通办法!

创建未验证的FK。

这是一次 “即时” 行动。然后,您可以在闲暇时对其进行验证-这不再需要对父母或孩子进行独占锁定。所以DML可以在运行时继续。

alter table ct add constraint fk_pt foreign key (p_fk) references pt (p_pk) novalidate;
alter table ct modify constraint fk_pt validate;

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论