Лучший способ справиться с состоянием гонки ядра .netC#

Место общения программистов C#
Ответить
Anonymous
 Лучший способ справиться с состоянием гонки ядра .net

Сообщение Anonymous »

Я столкнулся с огромной ошибкой в ​​моем проекте веб-API ядра .net
со стороны FE, есть ошибка, которая вызывает API дважды с точностью до одной и той же миллисекунды (дублирует запрос)
это функция, которая вызывается дважды

Код: Выделить всё

public async Task DeviceAsync(string deviceId)
{
var semaphore = _semaphores.GetOrAdd(deviceId, _ => new SemaphoreSlim(initialCount: 1, maxCount: 1));

var device = new Device();

await semaphore.WaitAsync(); // Wait to enter the semaphore

try
{
device = await this._repository.GetQueryable().SingleOrDefaultAsync(d => d.DeviceId == deviceId);

if (device == null)
{
//insert device
}
else
{
//edit device
}
await _repository.SaveChangesAsync();

return new ResponseDTO();
}
finally
{
semaphore.Release();
}
}
как вы видите, я использую SingleOrDefaultAsync, чтобы гарантировать, что в базе данных одновременно присутствует только один идентификатор устройства
проблема в том, когда два запроса поступают одновременно до одной и той же мс, идентификатор устройства вставляется в БД дважды вместо одного раза вставки и редактирования один раз, что позже вызывает ошибку в SingleOrDefaultAsync
Я ввел семафор, чтобы попытаться решить эту проблему, но он не сработал
и я не могу сделать поле «deviceId» уникальным в настройках БД, так как мне нужно использовать обратимое удаление сохранить информацию об устройстве даже после удаления
что еще я могу сделать, чтобы предотвратить эту ошибку
Очень важное примечание: я использую MySQL и не MS SQL

Подробнее здесь: https://stackoverflow.com/questions/791 ... -condition
Ответить

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

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

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

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

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