Когда я выполняю запрос EF в нескольких задачах, некоторые запросы возвращают ответ от другого запроса.
У нас сильно загруженная архитектура микросервисов. Некоторые сервисы имеют более старую архитектуру и неправильно распределяют DataContext, когда заканчивают его использовать. Тогда случается, что мы сталкиваемся с следующей проблемой запроса, возвращающего ответ от другого запроса.
TestContext context = new TestContext();
var results = context.Tests.First(t => t.Id == 1);
List<Task> todo = new List<Task>();
int done = 0;
int exception = 0;
int failed = 0;
for (int i = 0; i < 1000; i++)
{
//Test newTest = GenerateAddTask(context, todo, i);
//GenerateRemoveTask(context, todo, newTest);
Task getItemTask = new Task(() =>
{
try
{
Test test = context.Tests.First(t => t.Id == 1);
if (test.Id == 1 && test.Name == "test1")
{
done++;
}
else
{
failed++;
throw new System.Exception("Found it");
}
}
catch
{
exception++;
context = new TestContext();
}
});
Task getItemTask2 = new Task(() =>
{
try
{
Test test = context.Tests.First(t => t.Id == 2);
if (test.Id == 2 && test.Name == "test2")
{
done++;
}
else
{
failed++;
throw new System.Exception("Found it");
}
}
catch
{
exception++;
context = new TestContext();
}
});
todo.Add(getItemTask);
todo.Add(getItemTask2);
}
Parallel.ForEach(todo, new ParallelOptions { MaxDegreeOfParallelism = 100 },
t =>
{
t.Start();
});
Task.WaitAll(todo.ToArray());
В коде выше я создал базу данных со следующими данными
| Id | Name |
| 1 | test1 |
| 2 | test2 |
когда я вызываю строку с идентификатором 1, я ожидаю первую строку, но иногда получаю второй ответ.
В нашей системе это даже хуже, потому что у нас есть куча данных, и отследить, какой запрос вернул неправильное значение, практически невозможно.