Щях да забравя да опитам да заключа таблицата и/или да го направя в транзакция, има по-добри модели за това:
- Генерирайте уникален маркер
- Присвоете този маркер към следващия наличен запис
- Прочетете кой ред е получил токена и го обработете
По този начин изобщо не се нуждаете от заключване и транзакции (защото DB ще присвои токена ви САМО на ЕДИН неизползван запис).
Псевдокод:
$token = time(); //Only you have very low concurrency. Otherwise use something more unique, like a GUID or an identity value from a tokens table.
EXEC SQL: "UPDATE mytable SET token = $token WHERE token IS NULL LIMIT 1"
EXEC SQL: "SELECT id FROM mytable WHERE token = $token"
process($id);