0

ESQL を使用してデッドロックを管理する方法を理解しようとしています。O'Neil の本「Database」にある例とまったく同じように、「customers」テーブルを更新しようとする 2 つの同時プロセスを作成しました。 22deadabort%22+oracle&source=bl&ots=2QF7eSbaW6&sig=IcEZtSXINKrOVro1UN-ShlNsAak&hl=en&ei=9BPvTKPfMtP4nwfqu_X1Cg&sa=X&oi=book_result&ct=result&resnum=1&ved=0CBcQ6AEwAA#v=onepage&q=oraclef22%deadabort%2=false&22%deadabort%2

しかし、何らかの理由で、1 が終了するのを待っているプロセス 2 は、「exec sql update customers」ステートメントでブロックされ、「if(sqlca.sqlcode == DEADABORT)」ステートメントには決して入りません。したがって、デッドロックを管理することはできません。

誰かアイデアがありますか?

4

1 に答える 1

0

コードを見ずにコメントするのは難しいですが、2 つの接続がある場合でも、シングル スレッド プログラムでデータベース デッドロック エラーを生成するのは (不可能ではないにしても) 非常に困難です。

シングルスレッドプログラムで

  • 接続 A は行 R1 をロックします。
  • 接続 B は行 R2 をロックします。
  • 接続 A は行 R2 をロックしようとし、待機します

接続 A は単に接続 B を待機しているため、デッドロック状態には達していません。データベースは、両方のデータベース接続が単一のプロセス/スレッドからのものであることを認識していないため、それらがデッドロックされていることを認識していません。

この問題は、接続プールで発生することがあります。1 つのエンド ユーザー セッションが、プールからの接続を使用して共有リソースをロックします。他のプール接続は、その共有リソースで待機中のすべてを満たし、元のエンド ユーザー セッションはリソースを解放するための接続プール スレッドを取得できません。

于 2010-11-26T03:37:24.800 に答える