質問
「enq:」に遭遇し続けます。Oracle 9 DBで以下のSQLコマンドを実行すると、「TX - 行ロック競合」が発生します。テーブル mytable は、行数が 300 未満の小さなテーブルです。
UPDATE MYTABLE
SET col1 = col1 + :B3 ,
col2 = SYSDATE
WHERE :B2 = col3
AND :B1 = col4
同時に 10 個のスレッドを実行していますが、更新の機会を得るまでに 10 秒ほど待機するスレッドもあります。このデッドロックの問題に直面することはわかっていますが、私にとっての問題は、テーブルが小さいため、更新が高速になるため、より高速に処理できるはずであるということです。
編集:このコードはサードパーティのアプリケーション内にあるため、変更できません。DBを微調整することしかできません。
行ロックキューの速度を向上させるにはどうすればよいですか?スレッドの実行速度を高めるために、この待機時間を改善するにはどうすればよいでしょうか?
解決
ブロックされたくない場合は、やみくもに更新しようとしないでください. 。最初に SELECT FOR UPDATE NOWAIT を実行します。例外 (ORA-00054) が発生した場合、これは別のセッションが現在その行を処理していることを意味します。その場合、要件に応じて、別の行を更新するか (キュー/デキュー プロセスを構築しようとしていますか?)、待機するか (dbms_lock.sleep)、呼び出し元のアプリにエラー メッセージを返すことができます。
あなたはするであろう 一度もない 最初に FOR UPDATE NOWAIT を使用して行をロックすると、デッドロックが発生します。
所属していません StackOverflow