-1

重複の可能性:
Oracle に SKIP LOCKED で TOP N 行を返すように強制する

Oracle の FOR UPDATE 句で問題が発生しています。私がやりたいことは、テーブルからいくつかの値 (たとえば 1000 ですが、この値は実行時にユーザーによって変更される可能性があります) を選択して処理することです。ただし、私のアプリケーションは複数のノードで実行される可能性があり、それらはすべて同じテーブルを使用するため、複数のノードによって同じレコードがフェッチされないようにレコードをロックする必要があります。

それを実証するために、サンプル テーブルを作成してみましょう。

CREATE TABLE t (ID PRIMARY KEY) AS SELECT ROWNUM FROM dual CONNECT BY LEVEL <= 1000;

これが私がレコードを選択する方法です。ここでは、3 つのレコードをフェッチしようとしました。

SELECT rownum r, a.ID i
  FROM (SELECT * FROM t ) a 
 WHERE  rownum <= 3
 FOR UPDATE skip locked 

このクエリは 3 つのレコードを返します

+---+---+
+ R + I +
+---+---+
+ 1 + 1 +
+---+---+
+ 2 + 2 +
+---+---+
+ 3 + 3 +
+---+---+

(セッション 1 をコミットせずに) 別のセッションから同じクエリを実行すると、空の結果セットが返されます。しかし、私が本当に望んでいるのは、次の 3 つのアイテム (この場合は 4、5、6) を取得することです。これが予期される動作であることは理解していますが、適切な解決策が見つかりません。Oracle プロシージャを作成せずにこれを解決するにはどうすればよいですか?

4

2 に答える 2

1

これは以前に出てきたので、かなり詳細な回答をしました。

SKIP LOCKED を使用して Oracle に TOP N 行を返すように強制する

上記のスレッドで提供されている情報以外に (キューを使用する以外に) 別の方法を考えることはできません。

于 2011-10-17T09:11:28.073 に答える
-1

あなたの例の代わりに、SKIP LOCKEDあなたが実際に求めているのはREAD UNCOMMITTED、またはオラクルが熱心ではない「ダーティリード」です。

私はこの質問/回答を読んでみたい:オラクルはコミットされていない読み取りオプションを許可していますか?

于 2011-10-17T08:20:21.513 に答える