- - PR -
デッドロックが解放される優先順位って・・・?
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-03-14 15:46
いつもお世話になります。>>皆様
ORACLE10gの環境においてデッドロックが発生します。 ある意味デッドロックはしょうがないと思っているのですが、 ある決まったパターンのデッドロックが検出されるといつも ある処理(A)がロールバックされ、別の処理(B)が勝ってしまいます。 デッドロック解放時は何をもってどちらのセッションを開放する、 という決まりはあるのでしょうか? それともただの偶然なのでしょうか? どなたか詳しい方、ご教示お願いいたします。 | ||||||||
|
投稿日時: 2008-03-14 18:48
ほとんどの場合はしょうがなくないと思います。 きちんと設計して秩序に従った順序でロックがかかれば デッドロックは発生しないものです。 もし、デッドロックの発生を前提とするのならば、 トランザクションのリトライも前提とすべきでしょう。
おそらく順序は規定されていないと思います。 デッドロックは2つのトランザクションだけでなく、 複数のトランザクションに渡って循環的に発生する場合もあります。 以前に挙動を確認した時には、単純にロックの瞬間にWait-For-Graphを 分析して検出できた場合はそのトランザクションが選ばれたようですが、 際どいタイミングの場合や、分散トランザクションを利用している場合は 定期的なWait-For-Graphの分析やタイムアウトを利用するはずなので、 その場合は見つけ次第ロールバックさせる動きになりそうだと思います。 | ||||||||
|
投稿日時: 2008-03-14 20:49
サイクルデッドロックの多発は、完全な設計ミスですね。
MSSQLの変換デッドロックは仕方ないが、ORACLEでは言い訳しようがない。 | ||||||||
|
投稿日時: 2008-03-17 09:45
たいていのDBMSでは、次のような場合に、デッドロックが発生します。 特に、Oracleでは、デッドロックが発生したトランザクションをロール バックさせているようです。 ・トランザクション1 表Aを更新待ちロックをかけ、表Bにも更新待ちロックをかけてA,Bの順に UPDATEする。 ・トランザクション2 表Bを更新待ちロックをかけ、表Aにも更新待ちロックをかけてB,Aの順に UPDATEする。 要するに、ロックをかける順番が違っているために発生しています。 この場合、表A→表Bを更新するシリアルなロジックをストアドなど実現させ て、アプリケーションからはそのストアドを使用して更新処理を行うように 設計変更される方が無難だと思います。 (ちなみに情報処理テクニカルエンジニア、データベースの試験にこのデッド ロックの問題がよく出題されていますね。) | ||||||||
|
投稿日時: 2008-03-17 10:59
皆様お忙しいところご対応ありがとうございます。
ということは >>ある処理(A)がロールバックされ、別の処理(B)が勝ってしまいます。 は偶然じゃないか、という回答と認識してよろしいでしょうか。 よろしくお願いいたします。 |
1