使用VALIDATE启用Oracle约束时锁定?

时间:2013-04-27 16:51:25

标签: oracle locking constraints

有锁吗?

  1. 当约束从已禁用更改为已启用时?
  2. 当它从 novalidate 更改为验证时?
  3. The documentation说无锁:

      

    如果从ENABLE更改任何单个约束的状态   NOVALIDATE为ENABLE VALIDATE,可以执行操作   并行,并且不阻止读取,写入或其他DDL操作。

    这里有一个锁:

      

    表中的约束是使用INITIALLY IMMEDIATE定义的   条款。您使用ENABLE VALIDATE执行了ALTER TABLE命令   选项以启用已禁用的约束。它可以防止插入,   在约束条件下更新和删除表上的操作   启用的过程。

1 个答案:

答案 0 :(得分:0)

我认为在第一个引用中,约束已经启用了novalidate。由于已启用约束,因此所有新插入和更新都必须符合约束。在已启用约束的“启用验证”期间,历史数据不会更改为违反约束(因此不需要读锁定),并且新数据必须符合约束,因为它已经启用(因此不需要写锁定)。

在第二个引用中,禁用约束。由于它是使用validate启用的,因此在验证成功之前,它不能添加约束。由于启用约束可能成功或失败,具体取决于历史数据,插入/更新语句不知道是否在启用后检查约束,这意味着它必须锁定直到操作完成。这两者之间的区别主要在于指定了validate时是否禁用了约束。

这是一个帮助说明这一点的例子。想象一下,你经营一家企业,几年后你决定不再接受便士了。上面的第一个场景说你可以继续接受新的交易,只要他们都没有用便士支付,在某个时候,你会查看你的收据,看看过去是否有人用便士支付,但收银员可以继续工作而不管。第二个场景说“如果没有人用便士支付,那么我就不想再接受便士了” - 所以你的收银员必须等到你检查收据,看看是否有人在他/她知道之前是否用便士付款或者不接受带有便士的新交易,因此收银员锁定登记册并回家直到您完成审计。我知道这不是最好的例子,但这是一个复杂的话题,所以我希望这有帮助。