问题描述
对于DDL运行以添加FK约束 (在unindexedcolumn上) 的时间段,第二个会话无法读取子表和父表。
这种行为是预期的/记录的吗?
无论如何都有避免问题 (这表明应用程序对用户不可用)。
livesql中的NB测试用例未运行到完成 (配额),并且我不知道如何启动第二个会话以尝试在第一个会话中读取表。
这种行为是预期的/记录的吗?
无论如何都有避免问题 (这表明应用程序对用户不可用)。
livesql中的NB测试用例未运行到完成 (配额),并且我不知道如何启动第二个会话以尝试在第一个会话中读取表。
专家解答
是的。
添加外键会在父表和子表上产生排他锁。您可以通过在创建FK时查询dba_ddl_locks来看到这一点:
正如医生所说:
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可以在运行时继续。
添加外键会在父表和子表上产生排他锁。您可以通过在创建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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




