- PR -

デッドロックが解放される優先順位って・・・?

1
投稿者投稿内容
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-03-14 15:46
いつもお世話になります。>>皆様

ORACLE10gの環境においてデッドロックが発生します。
ある意味デッドロックはしょうがないと思っているのですが、
ある決まったパターンのデッドロックが検出されるといつも
ある処理(A)がロールバックされ、別の処理(B)が勝ってしまいます。

デッドロック解放時は何をもってどちらのセッションを開放する、
という決まりはあるのでしょうか?
それともただの偶然なのでしょうか?

どなたか詳しい方、ご教示お願いいたします。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2008-03-14 18:48
引用:

コウジさんの書き込み (2008-03-14 15:46) より:
ORACLE10gの環境においてデッドロックが発生します。
ある意味デッドロックはしょうがないと思っているのですが、



ほとんどの場合はしょうがなくないと思います。
きちんと設計して秩序に従った順序でロックがかかれば
デッドロックは発生しないものです。

もし、デッドロックの発生を前提とするのならば、
トランザクションのリトライも前提とすべきでしょう。

引用:

デッドロック解放時は何をもってどちらのセッションを開放する、
という決まりはあるのでしょうか?



おそらく順序は規定されていないと思います。

デッドロックは2つのトランザクションだけでなく、
複数のトランザクションに渡って循環的に発生する場合もあります。

以前に挙動を確認した時には、単純にロックの瞬間にWait-For-Graphを
分析して検出できた場合はそのトランザクションが選ばれたようですが、
際どいタイミングの場合や、分散トランザクションを利用している場合は
定期的なWait-For-Graphの分析やタイムアウトを利用するはずなので、
その場合は見つけ次第ロールバックさせる動きになりそうだと思います。
ハニワ祭り
大ベテラン
会議室デビュー日: 2005/11/15
投稿数: 115
投稿日時: 2008-03-14 20:49
サイクルデッドロックの多発は、完全な設計ミスですね。
MSSQLの変換デッドロックは仕方ないが、ORACLEでは言い訳しようがない。
YASUYOKA
ベテラン
会議室デビュー日: 2007/03/19
投稿数: 71
投稿日時: 2008-03-17 09:45
引用:

コウジさんの書き込み (2008-03-14 15:46) より:
<SNIP>
ORACLE10gの環境においてデッドロックが発生します。
ある意味デッドロックはしょうがないと思っているのですが、
ある決まったパターンのデッドロックが検出されるといつも
ある処理(A)がロールバックされ、別の処理(B)が勝ってしまいます。
<SNIP>



たいていのDBMSでは、次のような場合に、デッドロックが発生します。
特に、Oracleでは、デッドロックが発生したトランザクションをロール
バックさせているようです。

・トランザクション1
表Aを更新待ちロックをかけ、表Bにも更新待ちロックをかけてA,Bの順に
 UPDATEする。
・トランザクション2
 表Bを更新待ちロックをかけ、表Aにも更新待ちロックをかけてB,Aの順に
 UPDATEする。

要するに、ロックをかける順番が違っているために発生しています。
この場合、表A→表Bを更新するシリアルなロジックをストアドなど実現させ
て、アプリケーションからはそのストアドを使用して更新処理を行うように
設計変更される方が無難だと思います。
(ちなみに情報処理テクニカルエンジニア、データベースの試験にこのデッド
ロックの問題がよく出題されていますね。)
コウジ
ベテラン
会議室デビュー日: 2006/12/18
投稿数: 54
投稿日時: 2008-03-17 10:59
皆様お忙しいところご対応ありがとうございます。


引用:

あしゅさんの書き込み (2008-03-14 18:48) より:
おそらく順序は規定されていないと思います。



ということは
>>ある処理(A)がロールバックされ、別の処理(B)が勝ってしまいます。
は偶然じゃないか、という回答と認識してよろしいでしょうか。

よろしくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)