Наложить лимит на кредитные / дебетовые операции - PullRequest
0 голосов
/ 31 марта 2020

Я должен разработать кошельки для всех пользователей в моей компании. У меня есть таблица кошельков в mysql, в которой есть столбцы: wallet_id (int auto_increment Первичный ключ), user_id (int), balance (int)

У меня также есть отдельная таблица заказов со столбцами: id, wallet_id, type (кредит / дебет), сумма, добавлено_ (метка времени).

Мой пример использования: я могу разрешить только максимальный кредит и дебет в кошельке в размере 10000 в месяц. Эту проверку легко осуществить только для одного пользователя, я могу select sum(amount) from orders where month(added_on) = current_month and wallet_id = xyz. Если эта сумма плюс моя входная сумма (которая указана клиентом в запросе на добавление денег) меньше 10 000, тогда я продолжаю.

Однако как мне поступить с ней, когда есть возможность одновременных запросов? Проблема может быть в том случае, если wallet_id скажет, что xyz уже добавил 7000 рупий. этот месяц. Теперь я получаю два запроса одновременно, чтобы добавить 2000 рупий. Я хочу, чтобы только один из них преуспел. Я имею в виду следующие варианты:

  1. Глобальные распределенные блокировки (мьютекс) для wallet_id, так что одновременно обрабатывается только один запрос.
  2. Блокировки уровня DB (mysql) реализовать указанный выше запрос как SELECT for UPDATE. В этом случае второй подобный запрос выбора будет заблокирован.

Есть ли другой, более эффективный способ решить эту проблему без блокировок? Если нет, какой из двух выше может быть лучше?

...