простейший вариант:
$rand = rand(1, 1000000);
… WHERE ticket_id >=$rand AND user_id=0 LIMIT 1;
Если нагрузки действительно высокие, то генерируем заранее таблицу ticket_id(PK)|rand_num|user_id с уникальным rand_num, а в кеше храним инкремент от последнего купленного ID. Читаем и апдейтим исключительно по PK, и как фейловер — небольшая процедура получения ID последнего купленного билета из бд на случай падения кеша.