У меня есть этот случай.Мой метод Web Api в FileController допускается несколькими пользователями одновременно, и некоторые из них пытаются вставить одну и ту же запись одновременно.У меня есть проверка «если запись существует, возвращаемая ошибка», но так как метод доступен одновременно, контекст еще не обновлен, поэтому запись не существует в базе данных и вставляется двумя / болеепотоки.
[HttpPost]
[Route("api/Files/Import")]
public HttpResponseMessage Import(ImportFileRequest request)
{
using (var transactionMgr = managerTransactions.BeginTransaction()) //here BeginTransaction returns context.Database.BeginTransaction()
{
if(!managerTransactions.FilesRepository.FileExists(request.FileName))
{
File file = new File();
file.Name = request.FileName;
//other properties
managerTransactions.FilesRepository.Add(file);
managerTransactions.SaveCahnges();
transactionMgr.Commit();
}
else
{
throw new Exception("File exists");
}
}
}
Таким образом, перед сохранением метода два потока ввели метод и добавили файл. Второй поток, преобразованный перед сохранением, выполняется в первом потоке, и две записи добавляются в контекст.Затем выполняется сохранение и два файла добавляются в базу данных.Я не могу использовать TransactionScope, потому что наши клиенты не хотят устанавливать этот сервис, который должен быть установлен.Я пытался использовать объект блокировки, и он, кажется, работает, но я не знаю, хорошая ли это идея