на балансе оказалось 366 уе
Причина совершенно понятна, но есть вопрос, как от такого защититься? В теории если одновременно два запроса на -500 полетят и они друг друга закроют, то в результате будем иметь -500 на балансе вместо -1000
Решение есть у этой проблемы? Или я вообще зря парюсь и в теории такого не произойдет?
Решение в лоб - сделать синглтон, которому и делегировать выполнение подобных операции. Ну, соответственно, какой-нибудь lock на доступ к дбконтексту. Более красивое решение пока в голову не приходит
А, ну и без синглтона просто же lock на весь метод навернуть можно. Ну, если в одном процессе это все крутится
Сомневаюсь что это один процесс. Но сейчас попробую
Ну в смысле, если у тебя не раскатывается этот код по разным инстансам или на одной машине не запускается более чем в полном экземпляре
Единственное, что вместо lock рекомендуется использовать SemaphoreSlim, чтобы избежать возможного дедлока.
В async-методах вместо lock лучше использовать SemaphoreSlim, т.к. продолжение метода после await может исполнятся уже в другом потоке. И lock не разблокируется (он привязан к потоку)
Балансы считают как агрегат событий по изменению баланса, а не как число
Да, для этого есть транзакции в скл. А вообще балансы и правда лучше считать как сумму всех операций со счета пользователя, а не хранить числом
Давно хотел именно так и сделать, но не думал что это очень частая практика. Еще боюсь где-нибудь накосячить) Одна ошибка и баланс уже не верный...
Обсуждают сегодня