2

oracle 9 DBで以下のSQLコマンドを実行すると、「enq:TX-行ロックの競合」が発生し続けます。テーブルmytableは、300行未満の小さなテーブルです。

UPDATE MYTABLE
SET     col1 = col1 + :B3 ,
        col2    = SYSDATE
WHERE   :B2            = col3
    AND :B1        = col4

同時に10個のスレッドを実行し、更新の機会が得られるまで10秒も待つものもあります。このデッドロックの問題に直面することはわかっていますが、私にとっての問題は、テーブルが小さいため、テーブルが小さいため、更新が高速になるため、はるかに高速になるはずです。

編集:このコードを変更することはできません。サードパーティのアプリケーション内にあります。DBを微調整することしかできません。

ローロックキューの速度を向上させるために何ができますか?この待機時間を改善して、スレッドの実行速度を上げるにはどうすればよいですか?

4

1 に答える 1

2

ブロックされたくない場合は、盲目的に更新しようとしないでください。最初にSELECTFORUPDATENOWAITを実行します。例外(ORA-00054)を発生させた場合、これは別のセッションが現在その行で動作していることを意味します。その場合、要件に応じて、別の行を更新するか(キュー/デキュープロセスを構築しようとしていますか?)、待機するか(dbms_lock.sleep)、呼び出し元のアプリにエラーメッセージを返すことができます。

最初にFORUPDATENOWAITで行をロックすると、デッドロックに直面することはありません。

于 2010-03-11T14:49:45.163 に答える