число из БД, увеличивает его на 1, записывает увеличенное число в БД, и возвращает.
Нужно поддерживать уникальность этого числа
Проблема в том, что если я много раз вызову метод апи, в такой реализации, не поддерживается никакая блокировка.
Как правильно блокировать этот метод, как то на уровне БД? Вот код, который есть сейчас:
public async Task<int> GetCount()
{
var valueCount = await _context.Counter.FirstOrDefaultAsync();
valueCount.CountValue++;
await _context.SaveChangesAsync();
return valueCount.CountValue;
}
Одним запросом выполняйте просто, а не двумя. Типа update set value = value +1 Синтаксис на память не помню.
А в чём проблема с блокировкой? Не особо понял
Имеется в виду, что если в бд лежит 0, то после двух параллельных запросов может оказаться в БД не 2, в 1
Это понятно. В чём проблема заблокировать потоки на время обновления не понятно
Меня смущает ещё, что метод Get имеет side effect, не совсем очевидный по названию
Не масштабируется такой подход. Если у тебя несколько инстансов приложения — то всё разнесёт. Блокировка на уровне приложения работает только в случае, если ты можешь организовать для этого приложения монопольный доступ к базе. А это чаще всего не так (если у тебя админ смотрит в ту же базу и чего-то меняет руками — доступ уже получается не монопольный).
Обсуждают сегодня