Как исправить проблему обновления при одновременном запросе в веб-API ASP.NET 2C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 Как исправить проблему обновления при одновременном запросе в веб-API ASP.NET 2

Сообщение Гость »


Я работаю над проектом ASP.NET Web API 2 с .NET Framework 4.6.2. Когда я отправляю из Postman два одновременных запроса с одинаковыми параметрами, в базе данных обновляется только одна запись, хотя их должно быть две. Я приложил скриншоты запросов Postman и таблицу после ответа.

Вот код, который я использую:

private HttpResponseMessage CallGameNew(RequestDto requestDto) { // Код опущен для краткости. List gameBankResult = null; //Запрос базы данных GameBank gameBankResult = _unitOfWork.GameBankRepository.GetGames(g => g.productCode == requestDto.productCode && g.referenceId == Guid.Empty); if (gameBankResult != null && gameBankResult.Count() >= requestDto.quantity) { вар k = requestDto.quantity - 1; for (var i = k; i >= 0; --i) { gameBankResult.clientTrxRef = gameRequest.clientTrxRef; gameBankResult.referenceId = gameRequest.referenceId; gameBankResult.requestDateTime = DateTime.Now; gameBankResult.responseDateTime = DateTime.Now; } //***** ОБНОВЛЕНИЕ GameBank ***** _unitOfWork.GameBankRepository.Update(gameBankResult[k]); если (requestDto.quantity == 1) { //Код опущен для краткости. } } _unitOfWork.Сохранить(); обратный ответ; } Скриншоты:
Изображение

Изображение


Похоже, это изменение работает. Интересно, какие у вас есть предложения? Есть ли области, требующие улучшения?

//Обновить GameBank пытаться { _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); } улов (DbUpdateConcurrencyException) { // Обновляем и повторяем попытку gameBankResult[k] = _unitOfWork.GameBankRepository.GetByID(gameBankResult[k].GameBankID); _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); } Отправьте 2 одновременных запроса от Postman, и я ожидал увидеть 2 обновленные записи в базе данных.

Изменить1:

Фабио был прав, а как насчет этого кода?
//Обновить GameBank пытаться { _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); } улов (DbUpdateConcurrencyException) { // Обновляем и повторяем попытку gameBankResult[k] = _unitOfWork.GameBankRepository.GetByID(gameBankResult[k].GameBankID); _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); пытаться { _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); } улов (DbUpdateConcurrencyException ex) { интервал повторных попыток = 0; Bool isConcurrencyHandled = ложь; while (retryCount < 3 && !isConcurrencyHandled) { пытаться { gameBankResult[k] = _unitOfWork.GameBankRepository.GetByID(gameBankResult[k].GameBankID); _unitOfWork.GameBankRepository.Update(gameBankResult[k]); _unitOfWork.Сохранить(); isConcurrencyHandled = правда; } улов (DbUpdateConcurrencyException) { повторитьСчетчик++; } } если (!isConcurrencyHandled) { // Обработка ошибки параллелизма } } }
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»