私はOpenEdgeバージョン11.1を使用しています。私は時折、実行時に次のエラーメッセージを取得しています:10秒のOpenEdgeレコードロックデバッグ
ロック待ちタイムアウトが私のデバッグログによると(8812)
を満了し、エラーがデバッグすることが非常に困難にしているさまざまなクラスで発生しています。あるレコードがロックされているなど、エラーの詳細をデバッグログに出力する方法はありますか?
私はOpenEdgeバージョン11.1を使用しています。私は時折、実行時に次のエラーメッセージを取得しています:10秒のOpenEdgeレコードロックデバッグ
ロック待ちタイムアウトが私のデバッグログによると(8812)
を満了し、エラーがデバッグすることが非常に困難にしているさまざまなクラスで発生しています。あるレコードがロックされているなど、エラーの詳細をデバッグログに出力する方法はありますか?
これは、通常、既にロックされているレコードをロックしようとしていることを意味します。 OpenEdgeは10秒間(または-lkwtmo起動パラメータで指定された時間)待ち、ログを残してエラーをログに残します。
ロックされているレコードを確認するには、_Lockテーブルを参照してください。それは隠されたテーブルです。データ・ディクショナリに進み、「表示」 - 「隠しテーブルを表示」を選択すると、そのスキーマを表示できます。 _Lockレコードには、レコードID、ロックの種類(共有/排他)、ロックされたユーザーなどの情報があります。このコードを使用してロックテーブルをファイルにダンプできます。うまくいけば、ロックされたレコードを追跡するのに役立ちます。
FIND FIRST <TableName> WHERE ... EXCLUSIVE-LOCK NO-WAIT NO-ERROR.
IF LOCKED(<TableName>) THEN ...
あなたはその後、IF-THEN
声明の中で、あなたのデバッグコードを追加することができます、ロックエラーをキャッチし、あなたのFIND
声明にNO-WAIT
を追加するには
OUTPUT TO VALUE("locktable.txt").
FOR EACH _Lock WHERE _Lock._Lock-RecID <> ? NO-LOCK:
FIND _File WHERE _File._File-Number = _Lock._Lock-Table NO-LOCK NO-ERROR.
PUT UNFORMATTED
_Lock._Lock-Name " "
_Lock._Lock-Usr " "
_File._File-Name " "
_Lock._Lock-RecID " "
_Lock._Lock-Type " "
_Lock._Lock-Flags
SKIP.
END.
OUTPUT CLOSE.
。
これは常にコンテキストに依存しますが、10秒は非常に短いです!私は1800秒の繁栄に慣れています。変更可能なデータベース起動システムのパラメータです。
これは数千人のユーザーがいる大企業です。完全にロック問題をコントロールする非常に良い方法は見つけられませんでしたが、私がしたことはたくさんのものを24/24監視するUnixスクリプトにいくつかのロジックを追加することです。
私が達成したことは、実際にロックタイムアウトが発生する前に、ヘルプデスクにアラートを送信することです。
_lock、_file(table)、および_userを使用すると、ロックされているユーザー、どのテーブルとどのレコードがかなり詳細な情報を持つことができます。
私たちの状況はおそらく異なりますが、1人のユーザーがレコードを10分間ロックすることは気にしませんが、別のユーザーが待機するレコードをロックしているユーザーを追跡したいと考えています。なぜなら、ロックタイムアウトが発生すると、コンテキストに応じてトラブルが発生する可能性があるトランザクションを元に戻すためです。
私たちはロックを書き留めておき、10分以上動かなければ、可能な限りすべて送信するアラートをトリガします。他のユーザーが同じレコードの「戦い」を含む。多くの場合、問題は、クリティカルなテーブルを更新して何らかの理由で画面を開いたままにしているユーザーです。
問題は、予期せずエラーが発生することです。エラーが発生するたびにこのコードを実行する方法はありますか? – user1982125
'FIND'で' NO-WAIT'を使い、 'LOCKED()'をチェックしてください。私はそれを私の答えに加えました。 – TheDrooper