2017-10-31 3 views
1

私のアプリケーションの3つの異なるインスタンスで実行されているすべてのクエリは、テーブルから行を1つずつキューとして読み取ろうとしています。次のロックされていない行を読み取る

SELECT * FROM order_request_status ors WHERE ors.status = 'new' and ROWNUM <= 1 order by ors.id asc for update skip locked 

ここで問題となるのは、1つのアプリケーションインスタンスによって行がロックされていて、2番目のアプリケーションインスタンスがクエリによってロックされていない次の行を読み込みたい場合です。しかし、これによって動作していません - 更新スキップがロックされています。

oracle dbを使用してキューのような機能を実装する方法をお勧めします。

答えて

0

SKIP LOCKED処理は、クエリによって行が返された後に行われます。述語は、ROWNUM<=1のために1つのレコードを読み込んだ後に停止するので、見つかったレコードが別のセッションによって既にロックされていると、そのレコードをスキップしてさらにレコードを見つけることができなくなります。

一度に1つのレコードのみを処理する場合は、ROWNUMを使用する代わりに、1つのレコードをカーソルからフェッチしてください。

+0

カーソルからレコードを1つだけ取得するにはどうすればよいですか?私はそれを制限するrownumを使用しているので、私は昇順でIDを注文することでシステムに入力された最初のレコードを取り出すことができます。 – vashishth

+0

'rをcur rにフェッチする 'https://docs.oracle.com/database/121/LNPLS/static.htm#GUID-9DEED64C-A87E-4EAD-97DA-ABDD3FDF172C –

関連する問題