Вы можете выполнить оба оператора в транзакции и только дать код пользователю, если фиксация транзакции завершится успешно.
Вам также нужно иметь WHERE used = 0
в вашем запросе SELECT, но я предполагаю, что это покрытоэтим?
... WHERE some conditions AND ...
Также вы не хотите, чтобы никакой блокировки там не было.