2

是否有锁:

  1. 当约束从禁用更改为启用时?
  2. 虽然它正在从novalidate更改为validate

文档说没有锁:

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

这里它说有一个锁:

表中的约束是使用 INITIALLY IMMEDIATE 子句定义的。您执行了带有 ENABLE VALIDATE 选项的 ALTER TABLE 命令以启用已禁用的约束。当约束处于启用过程中时,它会阻止对表的插入、更新和删除操作。

4

1 回答 1

0

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

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

这是一个示例来帮助说明这一点。想象一下,您经营一家企业,几年后您决定不再接受一分钱。上面的第一个场景说你可以继续接受新的交易,只要他们没有用便士支付,稍后,你会查看你的收据,看看过去是否有人用便士支付,但收银员可以继续工作不管。第二种情况说“如果没有人用便士付款,那么我不想再接受便士了” - 所以你的收银员必须等到你检查收据,看看是否有人用便士支付,然后他/她才知道是否或者不接受用便士进行的新交易,所以收银员在收银机上锁上锁然后回家,直到您完成审计。我知道这不是最好的例子,

于 2015-12-08T20:43:38.507 回答