Как при большом количество запросов вернуть из БД каждый объект только 1 раз?

Рейтинг: 0Ответов: 1Опубликовано: 08.04.2023

Сабж. Есть метод в WebApi

public string Get() 
    {
          using(ApplicationContext db = new ApplicationContext()) 
       {
            var Domain = db.Domain.Where(x => x.TryChek == null).Where(b => b.InProgress == null).FirstOrDefault();
            Domain.InProgress = true;
            db.SaveChanges();
            Console.WriteLine("Выдали " + Domain.Name);
            return JsonSerializer.Serialize(Domain);
       }
    }

По задумке метод должен выбирать из бд первый объект подходящий по фильтрам, ставить этому объекту temp.InProgress = true сохранять и возвращать его. И больше этот объект по идеи не должен попасть в выборку.
Но в консоле я вижу как один объект выдается по несколько раз, от 2 до 8.
Я предполагаю что объект не успевает сохранится и его берет другой поток. Пробовал оборачивать вlock, не помогает. Как исправить?

Ответы

▲ 2Принят

Самый простой и при этом самый медленный вариант, который не учитывает если вы запустите 2 или более серверов (процессов) одновременно.

Вы можете захватывать монитор на статический объект, то есть на объект, который существует в едиснтвенном экземрляре и расшарен между потоками.

Пример (пишу из головы, компилируемость не гаранттирую):

private static object _locker = new Object();

public string Get() 
{
    lock(_locker)
    {
        // тут ваш код. 
    }
}