Я должен разработать кошельки для всех пользователей в моей компании. У меня есть таблица кошельков в 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 рупий. Я хочу, чтобы только один из них преуспел. Я имею в виду следующие варианты:
- Глобальные распределенные блокировки (мьютекс) для wallet_id, так что одновременно обрабатывается только один запрос.
- Блокировки уровня DB (mysql) реализовать указанный выше запрос как
SELECT for UPDATE
. В этом случае второй подобный запрос выбора будет заблокирован.
Есть ли другой, более эффективный способ решить эту проблему без блокировок? Если нет, какой из двух выше может быть лучше?