Просто мы используем базу данных SQL, которая не сосет транзакции, вставим операцию использования кредита в одну транзакцию (возможно, если БД ограничит число кредитов до неотрицательного или чего-то подобного), и это должно невозможно для двух одновременных транзакций использовать один и тот же кредит. Базы данных действительно хороши в таких вещах, это как раз то, для чего они нужны.
По сути, просто добавьте все данные в базу данных и операции переноса, которые выполняются вместе в транзакции, и ваш интерфейсный код может просто притвориться, что параллелизма нет вообще. Что, конечно, и есть единственная причина, по которой СУБД существуют.
РЕДАКТИРОВАТЬ: Ваша схема не повлияет на правильность этого подхода (хотя там, где вы начнете / закончите транзакции), это повлияет на вашу производительность, а также как будет реализована БД. Я поднял этот вопрос только потому, что вы пометили вопрос «базой данных» и, похоже, не знаете, что БД ACID просто сделает то, что вы хотите, если вы правильно напишите свои запросы.