Generate Unique Random Auto-Number using Apex (medium-concurrency)

Published by

on


Generating high-concurrency unique random auto-number using Apex is very challenging, but using below code you can achieve a medium-concurrency situation.

public without sharing class UniqueAutoNumberGenerator{
    public static String generateAutoNumber() {
        String uniqueAutoNumber;
        Boolean isUnique = false;
        Integer reamaingSoqlCount = 0;

        while (!isUnique) {
            reamaingSoqlCount = limits.getLimitQueries() - limits.getQueries();
            uniqueAutoNumber = generateRandomNumber();
            isUnique = checkUniqueness(uniqueAutoNumber);
            //If the process consumed 80% of the limit
            if(reamaingSoqlCount < 80){
                 return 'ERROR';
            }
        }
        return uniqueAutoNumber;
    }
    
    private static String generateRandomNumber() {
        // Generate a random number using your desired logic
        // For example, you can use a combination of digits and letters
        
        // Example logic generating a 6-digit alphanumeric random number:
        String chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
        String randomNumber = '';
        for (Integer i = 0; i < 6; i++) {
            Integer index = Math.mod(Math.abs(Crypto.getRandomInteger()), chars.length());
            randomNumber += chars.substring(index, index + 1);
        }
        return randomNumber;
    }
    
    private static Boolean checkUniqueness(String autoNumber) {
        // Use record locking with the "FOR UPDATE" keyword to handle concurrency
        // This ensures that only one thread can access the records at a time
        
        // Example query for an object called "Autonumbers__c" with a field named "AutoNumberField__c":
        List<Autonumbers__c> existingRecords = [SELECT Id FROM Autonumbers__c WHERE AutoNumberField__c = :autoNumber FOR UPDATE];
        return existingRecords.isEmpty();
    }
}

Did this post help you?

Help to make such content add-free!

US$2.00