со стороны 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
Я ввел семафор, чтобы попытаться решить эту проблему, но он не сработал
и я не могу сделать поле «deviceId» уникальным в настройках БД, так как мне нужно использовать обратимое удаление сохранить информацию об устройстве даже после удаления
что еще я могу сделать, чтобы предотвратить эту ошибку
Очень важное примечание: я использую MySQL и не MS SQL
Подробнее здесь: https://stackoverflow.com/questions/791 ... -condition
Мобильная версия