Задать вопрос

Как избежать race condition при переводе денег?

Например, нужно сделать трансфер от одного пользователя на другой:

1. получаем баланс пользователя из базы

2. проверяем хватает ли средств для перевода по полученному балансу в пункте 1

3. обновляем значения у одного пользователя и другого в базе

Как здесь более правильно защититься от race condition при переводе денег от одного пользователя другому?
  • Вопрос задан
  • 1118 просмотров
Подписаться 4 Простой 3 комментария
Ответ пользователя Adamos К ответам на вопрос (4)
Adamos
@Adamos
1. получаем баланс пользователя из базы
2. проверяем хватает ли средств для перевода по полученному балансу в пункте 1
3. обновляем значения у одного пользователя и другого в базе

Вообще-то эти действия при желании выполняются одним атомарным запросом UPDATE ... JOIN ... WHERE.
После которого можно проверить, сколько строк изменил запрос - и либо сохранить информацию об успешно совершенной транзакции (у вас же не только сумма на счетах меняется, правда?), либо вернуть ответ о невозможности перевода.
Ответ написан
Комментировать