コラボレーション・デッドロックの解決
デッドロックとは、2 つ以上のプロセスが互いに他方のプロセスが先行するのを待っているために続行できない状況のことです。デッドロックは、コラボレーション内のイベントの独立性によって発生する並行性制御の望ましくない一面です。イベントの独立性の詳細については、「コラボレーション開発ガイド」を参照してください。
図 75 は、以下のイベントのシーケンスの結果として生じる、2 つのアクティブなコラボレーション・グループの間のデッドロックを示しています。
- 時刻 T1 に、コラボレーション A1 はイベント E1 を受け取ります。そして、コラボレーション B2 にサービス呼び出しを行い、E1 の子ビジネス・オブジェクトを送ります。コラボレーション A1 はサービス呼び出しが完了するのを待ちます。
- 時刻 T2 に、コラボレーション B1 はイベント E2 を受け取ります。そして、コラボレーション A2 にサービス呼び出しを行い、E2 の子ビジネス・オブジェクトを送ります。コラボレーション A2 はサービス呼び出しが完了するのを待ちます。
- 時刻 T3 に、コラボレーション B2 はコラボレーション B1 を待っています。これは、B2 と B1 のポート・バインディングが同じで、B1 からのイベントは、B2 のイベントが到着する前に送られているためです。
- 時刻 T4 に、コラボレーション A2 はコラボレーション A1 を待っています。これは、A2 と A1 のポート・バインディングが同じで、A1 からのイベントは、B1 のイベントが到着する前に送られているためです。
この時点で、すべてのコラボレーションは前に進むことができません。
注:
ポート・バインディングは、ビジネス・オブジェクト・タイプとコネクター名から成ります。ポート・バインディングの詳細については、「コラボレーション開発ガイド」を参照してください。
図 75. コラボレーション・グループ間のデッドロック
このセクションの内容は次のとおりです。
コラボレーション・デッドロックの検出手順
グループ・コラボレーション・デッドロックの検出手順
コラボレーション・デッドロックの修正手順
コラボレーション・デッドロックの検出手順
デフォルトでは、InterChange Server Express システムは InterChange Server Express を開始したときに自動的にデッドロックの検出を実行します。しかし、デッドロックの検出が実行され、コラボレーション・グループに多数のコラボレーション・オブジェクトが含まれていると、InterChange Server Express の始動が遅れることがあります。これは、InterChange Server Express は、グループ内のすべてのコラボレーション・オブジェクトを探索して、グループ内にデッドロックが存在するかどうかを判断するためです。このため、デッドロックが存在していなくても始動が遅れることがあります。
デッドロックの検出を実行しないように InterChange Server Express システムを構成できます。このようにすると、システムは、最初にデッドロックを検査せずにコラボレーション・グループを開始します。これにより InterChange Server Express をより迅速にブートできます。しかし、デッドロックの検出を実行しないように設定しているときに、デッドロックが存在していることがあります。この場合、あとからコラボレーションに送られるイベントが失敗することがあります。
System Manager には、DEADLOCK_DETECTOR_CHECK 構成パラメーターを設定する機能が備わっていません。その代わり、この構成パラメーターを設定するには、InterchangeSystem.cfg ファイルを編集し、ファイルの中でパラメーターの値を変更する必要があります。
デッドロック検出を行うように InterChange Server Express システムを構成するには、以下の手順を実行します。
- InterchangeSystem.cfg ファイルを開きます。このファイルの次の行で DEADLOCK_DETECTOR_CHECK パラメーターが定義されています。
<tns:name>DEADLOCK_DETECTOR_CHECK</tns:name>
<tns:value xml:space="preserve">false</tns:name>
- デッドロック検出を実行したい場合は、false の値を true に変更します。
- デッドロック検出を実行したくない場合は、値を false に変更します。
グループ・コラボレーション・デッドロックの検出手順
グループ・コラボレーション・デッドロックが起きていないかどうかを確認するには、以下のいずれかを実行します。
- System Manager で、実行中のグループ・コラボレーションを右マウス・ボタンでクリックし、「診断」をクリックします。
ウィンドウが現れ、次のメッセージが表示されます。
このコラボレーションでは以下の診断テストが実行されました。
このメッセージの後に、以下のいずれかの結果が示されます。
- 停止中のコラボレーションが開始された時点で以下のエラーがないか InterchangeSystem.log ファイルを検査します。
エラー 11135: コラボレーション collaboration_name のグループのアクティブ化が原因で、1 つ以上の既存のコラボレーション・グループでデッドロックが発生する可能性があります。そのため、許可されません。
このエラーは、デッドロックの状態が発生する可能性があることを警告しているにすぎません。エラー 11135 の前に表示される情報メッセージに、デッドロックになる可能性があるアクティブなコラボレーション・グループが示されています。
コラボレーション・デッドロックの修正手順
コラボレーション・デッドロックを修正するには、以下の手順を実行します。
- その他のコラボレーションをすべて正常にシャットダウンします。
- サーバーを即時にシャットダウンします。InterChange Server Express システムのシャットダウン方法の詳細については、InterChange Server Express のシャットダウンを参照してください。
- システムを再始動します。システムを再始動すると、デッドロックの原因となった停止状態のコラボレーションは、自動的に開始し、自身がサポートするビジネス・オブジェクトをすべて再サブスクライブします。コラボレーションがデッドロックに入る原因となったビジネス・オブジェクトは再デリバリーされます。
デッドロックは時間に関係するので、コラボレーションが別のデッドロックに入ることはありません。
サーバーの負荷と分離順序付けが、システムでデッドロックが発生したときと同じになることはほとんどありません。
- システムを再始動してから、該当するコラボレーションをシャットダウンし、デッドロックが再び起こらないようにポートを再バインドしてください。
コラボレーション・デッドロックの防止手順
コラボレーションのデッドロックを防ぐには、System Manager
のサーバー構成画面の「データベース」タブでデッドロック再試行の設定を構成します。
デッドロック再試行メカニズムを構成するには、以下の手順を実行します。
- System Manager の「InterChange Server コンポーネント管理」ビューでサーバーを右マウス・ボタンでクリックし、「構成を編集」をクリックします。編集ツールが開き、InterchangeSystem.cfg ファイルを編集できます。
- 「データベース」タブをクリックします。ダイアログ・ボックスが表示され、ここでシステム・レベルのデータベース構成の構成に必要なパラメーターを入力できます (図 76 を参照)。
図 76. 「構成を編集」画面の「データベース」タブ
- 「最大デッドロック再試行回数」フィールドには、デッドロック発生時にサーバーに実行させる最大再試行回数を表す数値を入力します。
- 「デッドロック再試行間隔」フィールドには、再試行前にシステムに待機させる秒数を表す数値を入力します。
