2

ロックはありますか:

  1. 制約が無効から有効に変更されている間?
  2. そして、novalidateからvalidateに変更されていますか?

ドキュメントにはロックがないと書かれています:

単一の制約の状態を ENABLE NOVALIDATE から ENABLE VALIDATE に変更すると、操作は並列で実行でき、読み取り、書き込み、またはその他の DDL 操作をブロックしません。

ここでは、ロックがあると言っています:

テーブルの制約は、INITIALLY IMMEDIATE 句で定義されます。ENABLE VALIDATE オプションを指定して ALTER TABLE コマンドを実行し、無効になっていた制約を有効にしました。制約が有効化されている間は、表に対する挿入、更新、および削除操作を防止します。

4

1 に答える 1

0

最初の引用では、制約はすでに novalidate で有効になっていると思います。制約は既に有効になっているため、新しい挿入と更新はすべて制約に準拠する必要があります。すでに有効になっている制約からの「有効化検証」中に、履歴データが変更されて制約に違反することはなく (読み取りロックは必要ありません)、新しいデータは既に有効になっているため制約に準拠する必要があります (書き込みロックは必要ありません)。

2 番目の引用では、制約が無効になっています。検証で有効になっているため、検証が成功するまで制約を追加しないでください。履歴データに応じて、制約の有効化が成功または失敗する可能性があるため、insert/update ステートメントは、有効化されるまで制約をチェックするかどうかがわからないため、操作が完了するまでロックする必要があります。この 2 つの違いは、基本的には、validate を指定したときに制約が無効になっていたかどうかです。

これを説明するのに役立つ例を次に示します。あなたがビジネスを経営していて、数年後に小銭を受け取りたくないと決めたと想像してみてください。上記の最初のシナリオでは、ペニーで支払う人がいない限り、新しいトランザクションを受け入れ続けることができ、後で領収書を調べて、過去にペニーで支払った人がいないかどうかを確認しますが、レジ係は作業を続けることができます。関係なく。2 番目のシナリオは、「誰もペニーで支払ったことがない場合、私はもうペニーを受け取りたくありません」と言います。または、ペニーでの新しい取引を受け入れないため、レジ係はレジスターにロックをかけて、監査が完了するまで家に帰ります。これが最良の例ではないことはわかっていますが、

于 2015-12-08T20:43:38.507 に答える