Du skulle vara bättre att lagra en tabell med alla 10 000 möjliga värden definierade, och en "in-use"-flagga på varje. På så sätt är frisläppandet av numret för återanvändning en enkel uppdatering för att ställa in "inuse=false".
Det är också enkelt att hitta det lägsta tillgängliga värdet
SELECT idstring
FROM idstringtable
ORDER BY idstring ASC
WHERE (available = 1)
LIMIT 1
Att göra det med lämpliga lås/transaktioner skulle förhindra att två eller flera förfrågningar får samma ID, och eftersom det är ett litet bord skulle ett globalt tabelllås inte påverka prestandan nämnvärt.
Annars skulle du fastna och rota runt ditt användarbord och försöka hitta det första "gapet" i numreringssekvensen.