タイムアウトおよびロッキングの問題:DB2 データベース・ロード・ユーティリティー

以下のヒントを使用して、IBM® Campaign に DB2® データベース・ロード・ユーティリティーを使用する際に発生する可能性のあるタイムアウトおよびロッキングの問題をトラブルシューティングしてください。

症状

複数のフローチャートが同時に実行されており、同じ表に書き込まれます。以下のエラーが表示され、フローチャートを実行できません。

  • IBM Campaign UI: 「ローダー・コマンドがエラー・ステータス 4 で終了しました。」
  • ローダー・ログ: 「SQL0911N デッドロックまたはタイムアウトのため、現在のトランザクションがロールバックされました。」

例えば、「メール・リスト」プロセス・ボックスを使用している UA_ContactHistory 表にレコードを挿入するのに、複数のフローチャートを使用しています。

原因

ロード・ユーティリティーでは、階層レベルのデータのロードはサポートされていません。同じ表にデータをロードするフローチャートを同時に複数実行する場合、各ロード・プロセスで表がロックされます。各ロード・プロセスは、前のロードが完了するのを待たなければなりません。プロセスが完了するのに時間がかかる場合は、キューに入れられている次のロード・プロセスがタイムアウトになり、上記のエラーが表示されます。

ロード操作中の表ロック: 大抵の場合、ロード・ユーティリティーは、表レベル・ロックを使用して、表へのアクセスを制限します。ロックのレベルは、ロード操作の段階、およびロード操作が読み取りアクセスを許可するように指定されているかどうかによって異なります。

ALLOW NO ACCESS モードのロード操作は、ロード中に表に対して超排他ロック (Z ロック) を使用します。ALLOW READ ACCESS モードのロード操作を開始する前に、ロード・ユーティリティーは、ロード操作前に開始したすべてのアプリケーションが、ターゲット表に対するロックを解放するのを待機します。ロード操作の始めに、ロード・ユーティリティーは表に対する更新ロック (U ロック) を獲得します。これは、データがコミットされるまで、このロックを保持します。ロード・ユーティリティーが表に対する U ロックを獲得する際、そのロード操作の開始前に表に対するロックを保持しているすべてのアプリケーションがそれらのロック (互換性のあるロックでも) を解放するのを待機します。これは U ロックを Z ロックに一時的にアップグレードすることによって達成されます。ターゲット表に対する新しい表ロック要求が出されても、要求されるロックがロード操作の U ロックと互換性のあるものである限り、Z ロックがこれと競合することはありません。データがコミットされるときに、ロード・ユーティリティーはロックを Z ロックにアップグレードするため、コミット時には、競合するロックを持つアプリケーションが終了するまでロード・ユーティリティーが待機することで、幾らかの遅延が発生する場合があります。

注:
  • MinReqForLoaderCommand および MinReqForLoaderCommandForAppend は、コンタクト履歴テーブル、詳細コンタクト履歴テーブル、およびレスポンス履歴テーブルには適用されません。
  • アプリケーションが表に対するロックを解放するのを待機する間に、ロード操作がロードを開始しないうちにタイムアウトになる可能性があります。ただし、データをコミットするために必要な Z ロックを待機している間に、ロード操作がタイムアウトになることはありません。

問題の解決

回避策:IBM Campaign は、Loadercommand 構成プロパティーで指定されたシェル・スクリプト (Windows の場合は、実行可能ファイル) を使用して、データベース・ロード・ユーティリティーを呼び出します。シェル・スクリプトまたは実行可能ファイルにキューイング・ロジックを追加して、この問題を回避できます。このロジックは、表に対するロード操作を実行しているローダーが 1 つかどうかを確認します。その場合、他のローダーは前のローダーが完了するまでロードを開始できません。