スケジュールバッチのトランザクション処理順について共有します。
例えば、10件のデータを1トランザクション毎2件ずつ処理するようになります。
その処理は直列で実行されます。
以下の例で確認できます。
global class SampleBatch implements Database.Batchable<sObject> {
// The batch job starts
global Database.Querylocator start(Database.BatchableContext bc){
String query = 'SELECT Id, Name FROM Account LIMIT 100';
return Database.getQuerylocator(query);
}
// The batch job executes and operates on one batch of records
global void execute(Database.BatchableContext bc, List<sObject> scope){
System.debug(LoggingLevel.INFO, '>>> execute start at ' + DateTime.now().format('yyyy/MM/dd hh:mm:ss'));
Long startTime = DateTime.now().getTime();
Long finishTime = DateTime.now().getTime();
while ((finishTime - startTime) <= 2000) {
//sleep 2s
finishTime = DateTime.now().getTime();
}
System.debug(LoggingLevel.INFO, '>>> execute end at ' + DateTime.now().format('yyyy/MM/dd hh:mm:ss'));
}
// The batch job finishes
global void finish(Database.BatchableContext bc){
AsyncApexJob job = [SELECT Id, Status FROM AsyncApexJob WHERE Id = :bc.getJobId()];
System.debug(LoggingLevel.INFO, '>>>> finish ' + job.Status);
}
}
バッチ実行
Integer BATCH_SIZE = 2;
SampleBatch sb = new SampleBatch();
Database.executeBatch(sb, BATCH_SIZE);