We can run 3 batch jobs sequentially by incrementing the jobCounter and passing the integer (job index) into the batch scope
This can be increased to any amount of batch jobs, the problem I solved was able to update the Contact and disable Users in the same code running as different batch job.
As you cannot call @future in a batch method this solves by running each update in their own batch = transaction 👍🏻
global with sharing class App_Job_Account_Delete implements System.Schedulable, Database.Batchable<Integer>, Database.Stateful, Database.AllowsCallouts { private List<JobError> jobErrors = new List<JobError>(); global Integer jobCounter = 1; public void execute(SchedulableContext sc) { Database.executeBatch(this, jobCounter); } public Integer[] start(Database.BatchableContext context) { return new Integer[] {jobCounter}; } public void execute(Database.BatchableContext context, Integer[] scope) { try{ if (isSandbox() || Test.IsRunningTest()){ if(scope[0] == 1) { //add your code here to run as part of 1st batch } else if (scope[0] == 2){ //add your code here to run as part of 2nd batch } else if (scope[0] == 3){ //add your code here to run as part of 3rd batch } } else { JobError jobError = new JobError(); jobError.message = 'Environment Error: Job will only run on dev and automation environment'; jobError.records = new List<SObject>(); jobErrors.add(jobError); } } catch (Exception ex){ JobError jobError = new JobError(); jobError.records = new List<SObject>(); jobError.message = 'Exception: ' + ex.getTypeName() + ': ' + ex.getMessage() + ' -- ' + ex.getCause(); jobErrors.add(jobError); } } public void finish(Database.BatchableContext context){ if (jobCounter<3){ jobCounter++; Database.executeBatch(this, jobCounter); } } public class JobError{ public String message; public List<SObject> records; } public void setJobError(List<JobError> jobErrors){ this.jobErrors = jobErrors; } public static Boolean isSandbox() { if ([SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox && ('Dev'.equalsIgnoreCase(CustomSettings.Environment__c) || 'Automation'.equalsIgnoreCase(CustomSettings.Environment__c))){ return true; } else { return false; } } }
Run the code as
Id batchprocessid = Database.executeBatch(new App_Job_Account_Delete());