* Option A: Governor limits are reset for each execution of theexecute()method in a batch job because each batch is treated as a separate transaction. * Option C: Batch jobs use asynchronous governor limits, which are higher than synchronous limits. :Apex Governor Limits Documentation
最新のコメント (最新のコメントはトップにあります。)
正解は **A** と **C** です。
### 領域の確認
* **領域:** **2. プロセスの自動化とロジック (Process Automation and Logic)**
* **トピック:** 非同期Apex (Asynchronous Apex)、Batch Apex、ガバナ制限
---
### 正解の解説
**A. Apex ガバナ制限は、execute() メソッドの各反復ごとにリセットされます。**
これこそが Batch Apex を使用する**最大のメリット**です。
Batch Apex は、大量のレコード(例:100万件)を、小さな塊(バッチサイズ、デフォルト200件)に分割して処理します。
それぞれの塊(チャンク)が処理されるたびに、新しいトランザクションとして扱われるため、**ガバナ制限(SOQL発行回数やDML回数など)はその都度ゼロにリセットされます**。
これにより、通常の同期処理では不可能な大量データ処理が可能になります。
**C. Apex ガバナー制限では、非同期制限レベルが使用されます。**
これも正解です。
Batch Apex は「非同期 (Asynchronous)」処理です。非同期トランザクションでは、通常の同期 (Synchronous) トランザクションよりも**緩い(高い)ガバナ制限**が適用されます。
**主な違いの例:**
* **CPU時間:** 同期=10秒 (10,000ms) に対して、**非同期=60秒 (60,000ms)**
* **ヒープサイズ:** 同期=6MB に対して、**非同期=12MB**
---
### 不正解の解説
**B. トランザクションの非同期性のため、Apex ガバナー制限を超えることはできません。**
これは **不正解** です。
非同期であっても、**制限は存在します**(例:CPU時間は60秒まで)。
もし `execute()` メソッド内で無限ループを書いたり、非効率な処理をして60秒を超えれば、当然 `System.LimitException: Apex CPU time limit exceeded` が発生して処理は失敗します。「超えることはできない(無制限である)」という記述は誤りです。
**D. Apex クラスのコンストラクターを呼び出すときに、Apex ガバナー制限が省略されます。**
これは **不正解** です。
コンストラクタ(`new MyBatchClass()`)が実行されるタイミングは、まだバッチジョブが開始される前、つまり**呼び出し元のトランザクション(多くの場合、ボタンクリックや匿名Apexなどの同期処理)の中**です。
したがって、コンストラクタ内の処理には、その時点での(通常は同期の)ガバナ制限が厳格に適用されます。
---
### 💡 学習のポイント:Batch Apexの仕組み
Batch ...