Batch Apex実行方式(並列・直列)とトランザクション間の状態保持

以前のポストに、スケージュール可能なApex一括処理バッチの実装について共有しましたが、 本ポストには引き続きApex一括処理バッチに関して、Apex一括処理バッチの各トランザクションの実行方式と各トランザクション間の状態保持について共有したいと思います。

Apex一括処理バッチ実行方式(並列・直列)

ご存知の通り、Apex の一括処理ジョブの各実行は、個別のトランザクションとみなされます。なので、1,000 件のレコードを含むApexの一括処理ジョブが、それぞれ 200 件のレコードを含む5つのトランザクションと分けて実行されます。複数のジョブが実行されている場合、Apexの一括処理ジョブの execute メソッドが並行して実行されますが、1つApex一括処理の各トランザクションが実行されるのは並列と直列どちらでしょうか?
実際には直列です、下記のサンプルコードとデバッグログではこの問題を解釈できます。

SampleBatch.cls


5トランザクションのデバッグログ内容

状態の保持

メンバー変数(静的メンバー変数も含む)の値がトランザクション間で保持せず、リセットされます。その状態をトランザクション間で保持したいであれば、例えばレコードのカウントや集計する場合、クラス定義でDatabase.Statefulを指定することで、インスタンス変数のみ(静的メンバー変数ではなく)がトランザクション間で値を保持できます。
下記のサンプルコードのように:

SampleBatchWithState.cls


5トランザクションのデバッグログ内容


参照 : https://developer.salesforce.com/docs/atlas.ja-jp.204.0.apexcode.meta/apexcode/apex_batch_interface.htm

Enjoy it!