2010-11-26 12 views
0

ESQLを使用してデッドロックを管理する方法を理解しようとしています。 http://books.google.ca/books?id=UXh4qTpmO8QC&pg=PA298&lpg=PA298&dq=%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=%22deadabort%22%20oracle&f=falseESQLでデッドロックが発生したときにsqlcodeがDEADABORTを返さない

しかし、何らかの理由で、1を待っているプロセス2がブロックを終了するのを待っている2つの並行プロセスを作成して、「customers」テーブルを更新しようとしました。ステートメント "exec sql update customers"で実行し、 "if(sqlca.sqlcode == DEADABORT)"ステートメントを入力しないでください。したがって、私はデッドロックを決して管理することはできません。

誰かがアイデアを持っていますか?

+0

この本を見ているうちに問題が発生しています。あなたが実行しているSQLを表示できる方が良いでしょう。 –

答えて

0

コードを見ることなく、コメントすることは難しいですが、デッドロックエラーは、2つの接続があっても単一のスレッドプログラムで生成することは難しくありません。シングルスレッドのプログラムで

  • 接続ロック行R1。
  • 接続Bは行R2をロックします。
  • 接続Aは、接続Aは、単にデータベースの両方のデータベース接続が単一であることを知っていない接続B.を待っているので、それがデッドロック状態に達していない行R2をロックしようと

を待ちますプロセス/スレッドがデッドロックしているかどうかはわかりません。

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

関連する問題