0

Oracle データベースを使用する C# のアプリケーションがあります。ロックされていない行を oracle データベースのテーブルからフェッチするクエリが必要です。ロックされていないすべての行を選択するにはどうすればよいですか?

この T-SQL (MS SQL Server) クエリを Oracle の方言に変換できる「翻訳者」はいますか?

SELECT TOP 1 * FROM TableXY WITH(UPDLOCK, READPAST);

Oracle にそのような機能がないことに少しがっかりしています。彼らは私にAQを使わせたいのですか?

4

3 に答える 3

3

Oracleにはこの機能、特にSELECTステートメントのSKIPLOCKED部分があります。引用するには:

SKIP LOCKEDは、対象の行をロックしている競合トランザクションを処理するための代替方法です。SKIP LOCKEDを指定して、WHERE句で指定された行のロックを試行し、別のトランザクションによってすでにロックされていることが判明した行をスキップするようにデータベースに指示します。

ドキュメントには、マルチコンシューマキューで使用するように設計されていると記載されていますが、これは、この環境で使用する必要があるという意味ではありません。ドキュメントにはこれが記載されていますが、大きな注意点があります。次のN個のロック解除された行を要求することはできません。次のN行のみが返され、そのうちロック解除された行が返されます。

SELECT * 
  FROM TableXY 
 WHERE ROWNUM = 1
   FOR UPDATE SKIP LOCKED

選択しているテーブルが排他モードでロックされている場合、つまり、他のセッションでテーブルをロックしないようにデータベースにすでに指示している場合、排他ロックが解放されるまで行は返されません。

于 2013-01-01T21:08:57.910 に答える
1

私は最近同じ問題に直面しました、そしてそれを解決した後、私はこのブログエントリを書きました:

http://nhisawesome.blogspot.com/2013/01/how-to-lock-first-unlocked-row-in-table.html

コメントを残してください!コメントをいただければ幸いです。

簡単な要約:最初にロック解除されたものを選択してロックする代わりに、レコードの束を選択し、次に束をループして、SKIPLOCKEDヒントを使用してロックを取得しようとします。選択したロックがロックできない場合は、ロックが取得されるか、ロックがなくなるまで、次のロックに進みます。

于 2013-01-22T17:39:54.893 に答える
0

ロックされている行を選択すると、select for update nowait でエラーが発生します。それはあなたが望むものですか?どのような問題を解決しようとしているのか、私は興味があります。実行時間の長いトランザクションがない限り、行のロックは瞬間的に一時的なものになります。

例:

CREATE TABLE TEST ( COL1 NUMBER(10) NOT NULL, COL2 VARCHAR2(20 BYTE) NOT NULL );

テスト (COL1) で一意のインデックス TEST_PK を作成します。

ALTER TABLE TEST ADD ( CONSTRAINT TEST_PK PRIMARY KEY (COL1) USING INDEX TEST_PK );

SQL セッション #1: SQL> insert into test values(1,'1111'); 1 行が作成されました。SQL> テスト値 (2,'2222') に挿入します。1 行が作成されました。SQL>コミット; コミット完了。SQL> 更新テスト セット col2='AAAA' where col1=1; 1行更新しました。

SQL セッション #2: ロックされた行を読み取ろうとすると、エラーが発生します:

SQL> select * from test where col1=1 for update nowait; select * from test where col1=1 for update nowait * 1 行目のエラー: ORA-00054: リソースがビジーで、NOWAIT を指定して取得するか、タイムアウトが期限切れになった

于 2013-01-01T23:10:59.437 に答える