共有ロックの代わりに進行中のデフォルトのロックを変更するにはどうすればよいですか?
2 に答える
[NO|EXCLUSIVE|SHARE]-LOCK 修飾子を使用してクエリにロック ステータスを追加することにより、個々のクエリ (FIND、FOR EACH など) ごとに変更できます。これをオフのままにしておくと、デフォルトの SHARE-LOCK が取得されます。
-NL パラメータで開始されたセッションでコードをコンパイルすることもできます。これにより、その r コードのデフォルトが NO-LOCK に変更されます。
私の理解が正しければ、Progress 4GL NO-LOCK は TSQL コマンドの WITH(NOLOCK) に似ています。アイデアは、できるだけ多くのレコードをできるだけ早く取得したいということと、編集しないレコードの SHARE-LOCK に伴う可能性があるリソースの競合を回避したいということです。現在、TSQL では、TSQL クエリを実行しているときに発生している編集が見逃される可能性があるという警告が表示されます。それが Progress 4GL/ABL に当てはまるかどうかはよくわかりません。私は Progress 9 と OpenEdge 10 / 11 に精通しています。Progress の専門家の皆様、私がここから離れすぎている場合は訂正してください。私はまだこれに少し慣れていません。
FOR-EACH コンストラクトでは、BREAK
orBY
キーワード (キーワードはSQL の場合by
と似ています) の前で、句の後に実行します。order
where
FOR EACH TableName
WHERE TableName.x > 10
AND TableName.y
NO-LOCK BREAK BY TableName.x:
/* Do Code */
END.
追加の EACH / FIRST / LAST クエリで FOR-EACH を使用する場合 (テーブル Subscription / サブテーブル MailSubscription を想定)、サブクエリごとにレベルを設定できます。この例では、Subscription レコードをトロールし、関連する MailSubscription レコードを探し、最終的な終了していないレコードを編集して、作業中に他のレコードを除外し、他のユーザーが編集できるようにメインのサブ レコードを開いたままにする必要があります。
FOR EACH Subscription
WHERE ProductID = 'DB'
AND Subscriber
AND GetsPaper
NO-LOCK,
LAST MailSubscription OF Subscription
WHERE MailSubscription.EndDate = ?
EXCLUSIVE-LOCK
BREAK BY Subscription.SubscriptionID:
/* Fix broken MailSubscription records */
END.
FIND-FIRST / FIND-LAST コンストラクトでは、where の後、NO-ERROR の前に実行します (IF-AVAILABLE コンストラクトを使用していると仮定します)。同じテーブルから 2 つの異なるレコードを取得する必要がある場合は、少なくとも 1 つのレコードに対してバッファーを定義する必要があることに注意してください。
FIND FIRST TableName WHERE TableName.x > 10 AND TableName.y NO-LOCK NO-ERROR.
IF AVAILABLE TableName THEN DO:
/* Do Code */
END.
NO-LOCK
と入れ替えることもできますEXCLUSIVE-LOCK
。ここで大きな力と大きな責任について引用する必要があるかもしれませんが、進行状況エディターにアクセスできる場合は、おそらく管理者から既に入手しています。安心してください。
十分な新しい Progress バージョンがある場合は、オンライン バックアップをお勧めします。DB という意味でのオンラインは、クラウド バックアップなどではなく、オンライン バックアップのために停止されることはありません。