在阅读this链接时,我不明白通过在外键列上添加索引来避免表锁定。谁能帮助我理解这一点?
此外,我从来不知道在阅读相同链接之前向外键添加索引的重要性(感谢Thomas Kyte和论坛!)。任何人都可以请指出我在实现外键时需要考虑的更多重要实现。
答案 0 :(得分:4)
假设有两个表PARENT
和CHILD
。假设CHILD.PARENT_ID
引用PARENT.PARENT_ID
并且CHILD.PARENT_ID
是必需(非空)列,并且CHILD.PARENT_ID.
上没有索引
更新PARENT_ID
或从PARENT
删除记录时,Oracle需要阻止新的交易在CHILD
中同时添加新记录,并删除PARENT_ID
的值。 Oracle可以使用针对CHILD.PARENT_ID
的索引来检查哪些记录(如果有的话)可能会受到影响 - 并阻止使用受PARENT_ID
影响的新行,直到针对{{1}的活动提交或回滚。
但是,此并发问题不存在此类索引。所以Oracle使用它拥有的唯一工具 - 完全锁定PARENT
表,直到针对CHILD
的操作提交或回滚。
答案 1 :(得分:1)
我不确定自己是否完全理解它,但您是否已阅读the Concepts Guide所说的内容?这解释了发生什么,但我不确定它是否解释了为什么。