0

Oracle では、(単一のデータベース接続で) 次のことが可能です。

  1. 単一の行 (row1) をロックします
  2. 次に、別の行 (row2) をロックします。
  3. 行 1 のロックを解放します (行 2 のロックを保持します)
  4. 別の行 (row3) のロックを取得する
  5. 行 2 のロックを解放します (行 3 のロックを保持します)
  6. 行3のロックを解放します

オラクルはさまざまな種類のロックをサポートしていることを認識しています(これは非常に役立つことがわかりました:http://broadh2o.net/docs/database/oracle/oracleLocks.html)ので、おそらく答えは選択されたロックの種類によって異なります。排他ロック、つまり、他の接続が行を更新するのを防ぐロックに興味があります。

単一のデータベース接続を使用して操作 1 ~ 6 を実行できるかどうかを知りたいです。行ごとに個別のデータベース接続を使用できます。ロックは COMMIT/ROLLBACK を使用して解放されるようです。そのため、単一の行でロックを解放することは不可能です。

4

1 に答える 1

2

行のロックを選択的に解放することはできません。行 1 をロックすると、そのロックはトランザクションの最後にのみ解放されます。ただし、トランザクションが終了すると、トランザクションが保持している他のロック (つまり、行 2 のロック) も解放されます。

解決しようとしているビジネス上の問題によっては、個々の行を実際にロックしたくない場合があります。dbms_lock場合によっては、パッケージを使用して、ユーザー定義のロックを取得および解放する必要があります。ユーザー定義のロックlock1lock2、およびlock3の場合、1 つのトランザクション内で概説したように、3 つのロックを取得して解放することができます。ただし、ユーザー定義のロックを設定することは、コードの適切なセクションを適切なロックで保護する必要がある開発者に多くの作業が必要であり、ユーザー定義のロックを要求できるため、非常に危険な場合があります。トランザクションがコミットまたはロールバックされたときに解放されないため、例外を正しく処理しないと、実際に自分自身を撃つことができます。

于 2013-06-13T16:12:36.770 に答える