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 プロシージャを作成せずにこれを解決するにはどうすればよいですか?