0

in do トランザクションでラベルを定義し、このラベルで排他的ロックを使用してテーブルにアクセスしています。ラベルの最後で、そのテーブルのすべての変更を行いました。今、私はトランザクションブロックにいます。ここで、別のセッションで同じテーブルにアクセスしようとしましたが、別のユーザーが使用するテーブルというエラーが表示されます。トランザクションでテーブルを解放して、別のユーザーがアクセスできるようにすることは可能ですか。

例えば:

セッション 1)

DO TRANSACTION:
  ---
  ---
  loopb:
  REPEAT:
    --
    --
    ---------------------> control is here right now.
  END. /*repeat*/
  -- 
  --
END. /*do transaction*/

セッション 2)

同じテーブルにアクセスしようとしましたが、エラーが表示され、そのテーブルは別のユーザーによってロックされています。

4

2 に答える 2

4

を使用してループ内で触れたすべてのレコードは、完了EXCLUSIVE-LOCKするまで別のユーザーがロックすることはできませんTRANSACTION。これを回避する方法はありません。2 番目のプロセスでそれらのレコードをロックする必要がある場合はTRANSACTION、最初のプロセスでスコープを縮小するしかありません。これは安全機能であるため、後で でエラーが発生した場合、 で行われたTRANSACTIONすべて変更TRANSACTIONがロールバックされます。別の見方をすると、 中にいくつかのレコード ロックを解放できた場合TRANSACTION、 の定義の一部である原子性 (全か無か) が失われることになりますTRANSACTION

2 番目のプロセスでこれらのレコードを実際にロックする必要はなく、更新された値を確認する必要がある場合は、それが可能であることに注意してください。更新されたレコードがレコード バッファに存在しなくなると (またはレコード ロック ステータスが にダウングレードされるNO-LOCKTRANSACTION)、リンボ ロックになり、 を使用して更新された値を表示できますNO-LOCK。ループの最後のレコードをリンボ ロックにするには、次のいずれかを行います。

FIND CURRENT tablerecord NO-LOCK.

または、これ以上レコード バッファにアクセスする必要がない場合は、次のようにします。

RELEASE tablerecord.
于 2010-06-11T14:54:31.017 に答える
3

他のセッションは、NO-LOCK を使用してレコードの「ダーティ リード」を実行できます。ただし、トランザクションがコミット (またはロールバック) されるまで、ロックしたり更新したりすることはできません。そして、繰り返しブロックが繰り返されるか、それを離れるまで、それは起こりません。

于 2010-07-25T14:49:07.853 に答える