ジョブスケジューラでジョブネット実行時等にデッドロックが発生する場合があります。

 

ジョブスケジューラでジョブネット実行時等にデッドロックが発生する場合があります。

【発生条件】 
Microsoft SQL Server を利用していること

ジョブスケジューラで利用しているテーブルのレコード削除時や更新時に、不要な暗黙的型変換が行われるため、テーブルスキャンが実行されやすくなっています。
テーブルスキャンが実行された場合にページ単位でロックが獲得されてしまうため、デッドロックが発生する可能性があります。

本 FAQ では、上記事象の対処方法について記載します。

【対処方法】
不要な暗黙的型変換が行われないようにします。
添付のモジュール(im_job_scheduler_8_0_7_later_specific_patch-1.0.0.imm)をダウンロードし、適用してください。
※下記記載の注意事項や適用(インストール)方法をご確認の上で添付モジュールを適用してください。

【モジュールに含まれる改善・修正要件】
添付モジュールに含まれる要件は以下になります。

ジョブスケジューラでジョブネット実行時等にデッドロックが発生する場合があります。
https://issue.intra-mart.jp/issues/29271

【注意事項】
1. 添付モジュールは、intra-mart Accel Platform 2014 Spring (Granada) 以降に対して適用できます。

2. 十分なテストを行っておりますが、お客様環境へ適用する際には、必ずお客様自身で動作確認を行ってください。

3. その他、以下製品の制限事項に準じます。
  intra-mart Accel Platform 2014 Spring (Granada) および 左記以降のアップデート製品

4. 添付モジュールは intra-mart Accel Platform 起動時に 1 度だけ 以下のテーブルの VARCHAR 型を NVARCHAR 型に変更する SQL(※ 1)を実行するものです。
  * imjob_monitor (ジョブネットの実行状況、実行結果を管理するテーブル)
  * imjob_monitor_task (モニタ上のジョブ単位の詳細なタスク情報を管理するテーブル)
  上記のテーブルの全件コピーを 2 度行うため、レコード数が多い場合、添付モジュールを適用後 intra-mart Accel Platform 初回起動時に時間がかかることが想定されます。

  そのため、お時間が確保できるタイミングで実施してください。
  参考値ではございますが弊社で検証したところ、以下の状態で intra-mart Accel Platform の起動に 20 分ほど要しました。
  ・imjob_monitor: 約 200万件
  ・imjob_monitor_task: 約 800万件
  
  2 度目以降の起動では実行されません。

  ※ 1. NVARCHAR 型に変更する SQL
========================================================
      CREATE TABLE imjob_monitor_bk (
          tenant_id VARCHAR(100) NOT NULL,
          id VARCHAR(200) NOT NULL,
          jobnet_id VARCHAR(200) NOT NULL,
          trigger_id VARCHAR(200) NOT NULL,
          status VARCHAR(24) NOT NULL,
          start_date_time DECIMAL(13,0) NOT NULL,
          end_date_time DECIMAL(13,0),
          message NVARCHAR(1000),
          create_user_cd VARCHAR(100) NOT NULL,
          create_date DATETIME2 NOT NULL,
          record_user_cd VARCHAR(100) NOT NULL,
          record_date DATETIME2 NOT NULL,
          PRIMARY KEY (tenant_id, id)
      );

      INSERT INTO imjob_monitor_bk SELECT * FROM imjob_monitor;

      DROP TABLE imjob_monitor;

      CREATE TABLE imjob_monitor (
          tenant_id NVARCHAR(100) NOT NULL,
          id NVARCHAR(200) NOT NULL,
          jobnet_id NVARCHAR(200) NOT NULL,
          trigger_id NVARCHAR(200) NOT NULL,
          status NVARCHAR(24) NOT NULL,
          start_date_time DECIMAL(13,0) NOT NULL,
          end_date_time DECIMAL(13,0),
          message NVARCHAR(1000),
          create_user_cd NVARCHAR(100) NOT NULL,
          create_date DATETIME2 NOT NULL,
          record_user_cd NVARCHAR(100) NOT NULL,
          record_date DATETIME2 NOT NULL,
          PRIMARY KEY (tenant_id, id)
      );

      INSERT INTO imjob_monitor SELECT * FROM imjob_monitor_bk;

      DROP TABLE imjob_monitor_bk;

      CREATE TABLE imjob_monitor_task_bk (
          tenant_id VARCHAR(100) NOT NULL,
          monitor_id VARCHAR(200) NOT NULL,
          task_id VARCHAR(200) NOT NULL,
          job_id VARCHAR(200) NOT NULL,
          status VARCHAR(24),
          start_date_time DECIMAL(13,0) NOT NULL,
          end_date_time DECIMAL(13,0),
          message NVARCHAR(1000),
          create_user_cd VARCHAR(100) NOT NULL,
          create_date DATETIME2 NOT NULL,
          record_user_cd VARCHAR(100) NOT NULL,
          record_date DATETIME2 NOT NULL,
          PRIMARY KEY (tenant_id, monitor_id, task_id)
      );

      INSERT INTO imjob_monitor_task_bk SELECT * FROM imjob_monitor_task;

      DROP TABLE imjob_monitor_task;

      CREATE TABLE imjob_monitor_task (
          tenant_id NVARCHAR(100) NOT NULL,
          monitor_id NVARCHAR(200) NOT NULL,
          task_id NVARCHAR(50) NOT NULL,
          job_id NVARCHAR(200) NOT NULL,
          status NVARCHAR(24),
          start_date_time DECIMAL(13,0) NOT NULL,
          end_date_time DECIMAL(13,0),
          message NVARCHAR(1000),
          create_user_cd NVARCHAR(100) NOT NULL,
          create_date DATETIME2 NOT NULL,
          record_user_cd NVARCHAR(100) NOT NULL,
          record_date DATETIME2 NOT NULL,
          PRIMARY KEY (tenant_id, monitor_id, task_id)
      );

      INSERT INTO imjob_monitor_task SELECT * FROM imjob_monitor_task_bk;

      DROP TABLE imjob_monitor_task_bk;
========================================================

【適用(インストール)方法】
1. IM-Jugglingを起動します。

2. 既存のプロジェクト(juggling.im)ファイルを開きます。

3. 「ユーザモジュール」タブを選択し、右上にある「+」アイコンをクリックします。

4. ダウンロードした im_job_scheduler_8_0_7_later_specific_patch-1.0.0.imm ファイルを追加します。
  https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/create_war/user_module.html

5. WARファイル(※1)、および、静的ファイル(※2)の出力を行ってください。

6. アンデプロイを行ってください。
  https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/uninstallation/index.html#war 

7. アンデプロイ後、※1、および、※2のファイル群をデプロイしてください。
  https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/deploy/index.html

【アンインストール方法】
1. IM-Jugglingプロジェクトを開き、本FAQ で追加したユーザモジュールを削除してください。
  ユーザモジュール選択後に右上の「×」アイコンをクリックすることで削除可能です。

2. WARファイル(※3)、および、静的ファイル(※4)の出力を行ってください。

3. アンデプロイを行ってください。
  https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/uninstallation/index.html#war

4. システムデータベースで以下の SQL を実行してください。
  ※添付モジュールのアンインストールのみが目的の場合はSQLの実行は必要ありませんが、製品のアップデートの場合はSQLの実行が必要になります。

========================================================
     CREATE TABLE imjob_monitor_bk (
         tenant_id VARCHAR(100) NOT NULL,
         id VARCHAR(200) NOT NULL,
         jobnet_id VARCHAR(200) NOT NULL,
         trigger_id VARCHAR(200) NOT NULL,
         status VARCHAR(24) NOT NULL,
         start_date_time DECIMAL(13,0) NOT NULL,
         end_date_time DECIMAL(13,0),
         message NVARCHAR(1000),
         create_user_cd VARCHAR(100) NOT NULL,
         create_date DATETIME2 NOT NULL,
         record_user_cd VARCHAR(100) NOT NULL,
         record_date DATETIME2 NOT NULL,
         PRIMARY KEY (tenant_id, id)
     );

     INSERT INTO imjob_monitor_bk SELECT * FROM imjob_monitor;

     DROP TABLE imjob_monitor;

     CREATE TABLE imjob_monitor (
         tenant_id VARCHAR(100) NOT NULL,
         id VARCHAR(200) NOT NULL,
         jobnet_id VARCHAR(200) NOT NULL,
         trigger_id VARCHAR(200) NOT NULL,
         status VARCHAR(24) NOT NULL,
         start_date_time DECIMAL(13,0) NOT NULL,
         end_date_time DECIMAL(13,0),
         message NVARCHAR(1000),
         create_user_cd VARCHAR(100) NOT NULL,
         create_date DATETIME2 NOT NULL,
         record_user_cd VARCHAR(100) NOT NULL,
         record_date DATETIME2 NOT NULL,
         PRIMARY KEY (tenant_id, id)
     );

     INSERT INTO imjob_monitor SELECT * FROM imjob_monitor_bk;

     DROP TABLE imjob_monitor_bk;

     CREATE TABLE imjob_monitor_task_bk (
         tenant_id VARCHAR(100) NOT NULL,
         monitor_id VARCHAR(200) NOT NULL,
         task_id VARCHAR(200) NOT NULL,
         job_id VARCHAR(200) NOT NULL,
         status VARCHAR(24),
         start_date_time DECIMAL(13,0) NOT NULL,
         end_date_time DECIMAL(13,0),
         message NVARCHAR(1000),
         create_user_cd VARCHAR(100) NOT NULL,
         create_date DATETIME2 NOT NULL,
         record_user_cd VARCHAR(100) NOT NULL,
         record_date DATETIME2 NOT NULL,
         PRIMARY KEY (tenant_id, monitor_id, task_id)
     );

     INSERT INTO imjob_monitor_task_bk SELECT * FROM imjob_monitor_task;

     DROP TABLE imjob_monitor_task;

     CREATE TABLE imjob_monitor_task (
         tenant_id VARCHAR(100) NOT NULL,
         monitor_id VARCHAR(200) NOT NULL,
         task_id VARCHAR(200) NOT NULL,
         job_id VARCHAR(200) NOT NULL,
         status VARCHAR(24),
         start_date_time DECIMAL(13,0) NOT NULL,
         end_date_time DECIMAL(13,0),
         message NVARCHAR(1000),
         create_user_cd VARCHAR(100) NOT NULL,
         create_date DATETIME2 NOT NULL,
         record_user_cd VARCHAR(100) NOT NULL,
         record_date DATETIME2 NOT NULL,
         PRIMARY KEY (tenant_id, monitor_id, task_id)
     );

     INSERT INTO imjob_monitor_task SELECT * FROM imjob_monitor_task_bk;

     DROP TABLE imjob_monitor_task_bk;
========================================================

5. アンデプロイ後、※3、および、※4のファイル群をデプロイしてください。
   https://document.intra-mart.jp/library/iap/public/setup/iap_setup_guide/texts/deploy/index.html

-- 対象 -------------------------------------------------------------------------
iAP/Accel Platform/2023 Autumn
iAP/Accel Platform/2023 Spring
iAP/Accel Platform/2022 Winter
iAP/Accel Platform/2022 Spring
iAP/Accel Platform/2021 Winter
iAP/Accel Platform/2021 Summer
iAP/Accel Platform/2021 Spring
iAP/Accel Platform/2020 Winter
iAP/Accel Platform/2020 Summer
iAP/Accel Platform/2020 Spring
iAP/Accel Platform/2019 Winter
iAP/Accel Platform/2019 Summer
iAP/Accel Platform/2019 Spring
iAP/Accel Platform/2018 Winter
iAP/Accel Platform/2018 Summer
iAP/Accel Platform/2018 Spring
iAP/Accel Platform/2017 Winter
iAP/Accel Platform/2017 Summer
iAP/Accel Platform/2017 Spring
iAP/Accel Platform/2016 Winter
iAP/Accel Platform/2016 Summer
iAP/Accel Platform/2016 Spring
iAP/Accel Platform/2015 Winter
iAP/Accel Platform/2015 Summer
iAP/Accel Platform/2015 Spring
iAP/Accel Platform/2014 Winter
iAP/Accel Platform/2014 Summer
iAP/Accel Platform/2014 Spring
--------------------------------------------------------------------------------


FAQID:1300

※添付ファイル

この記事は役に立ちましたか?
0人中0人がこの記事が役に立ったと言っています
Powered by Zendesk