Как при большом количество запросов вернуть из БД каждый объект только 1 раз?
Сабж. Есть метод в 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, не помогает. Как исправить?
Ответы (1 шт):
Самый простой и при этом самый медленный вариант, который не учитывает если вы запустите 2 или более серверов (процессов) одновременно.
Вы можете захватывать монитор на статический объект, то есть на объект, который существует в едиснтвенном экземрляре и расшарен между потоками.
Пример (пишу из головы, компилируемость не гаранттирую):
private static object _locker = new Object();
public string Get()
{
lock(_locker)
{
// тут ваш код.
}
}