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

