0

场景:我们有表 A(父表)引用表 B(子表),并且我们有每个外键的外键索引。

操作:现在当任何用户从表 A 中删除一行时,即使子表中没有引用记录,表 B 也会被锁定。由于该表已锁定,因此其他用户无法再对表 A 执行任何操作。

理解:我想当表B中存在一些子记录时,只有当父记录涉及某些事务并且其他用户仍然可以在表A的其他行上工作时,才应该锁定所选行。

问题:当我们有外键并且创建了外键索引但没有子记录存在时,它是如何工作的。整张桌子还锁着?如果是的话如何摆脱它呢?

注意:我使用的是 Oracle 12c。

4

1 回答 1

1

您应该对所有外键都有索引,否则您将获得 TM 表锁:

  1. https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:292016138754
  2. http://www.oaktable.net/content/tm-locking-checking-missing-indexes-foreign-key-constraints

现在,当任何用户从表 A 中删除一行时,即使子表中没有引用记录,表 B 也会被锁定。

如果子表中有外键索引,则子表中只能获得 TX 行锁。如果你的外键不是索引,你会在整个子表上获得 TM 表锁。

于 2020-09-18T15:05:31.040 回答